new static files.
Signed-off-by: rscnt <rascnt@gmail.com>
159
static/cms/js/jstree/_lib/_all.js
Normal file
|
|
@ -0,0 +1,159 @@
|
|||
// all, but without jquery !! (modified by Peter Cicman)
|
||||
|
||||
// css.js
|
||||
|
||||
function get_css(rule_name,stylesheet,delete_flag){if(!document.styleSheets)return false;rule_name=rule_name.toLowerCase();stylesheet=stylesheet||0;for(var i=stylesheet;i<document.styleSheets.length;i++){var styleSheet=document.styleSheets[i];css_rules=document.styleSheets[i].cssRules||document.styleSheets[i].rules;if(!css_rules)continue;var j=0;do{if(css_rules[j].selectorText.toLowerCase()==rule_name){if(delete_flag==true){if(document.styleSheets[i].removeRule)document.styleSheets[i].removeRule(j);if(document.styleSheets[i].deleteRule)document.styleSheets[i].deleteRule(j);return true;}
|
||||
else return css_rules[j];}}
|
||||
while(css_rules[++j]);}
|
||||
return false;}
|
||||
function add_css(rule_name,stylesheet){rule_name=rule_name.toLowerCase();stylesheet=stylesheet||0;if(!document.styleSheets||get_css(rule_name,stylesheet))return false;(document.styleSheets[stylesheet].addRule)?document.styleSheets[stylesheet].addRule(rule_name,null,0):document.styleSheets[stylesheet].insertRule(rule_name+' { }',0);return get_css(rule_name);}
|
||||
function get_sheet_num(href_name){if(!document.styleSheets)return false;for(var i=0;i<document.styleSheets.length;i++){if(document.styleSheets[i].href&&document.styleSheets[i].href.toString().match(href_name))return i;}
|
||||
return false;}
|
||||
function remove_css(rule_name,stylesheet){return get_css(rule_name,stylesheet,true);}
|
||||
function add_sheet(url){if(document.createStyleSheet){document.createStyleSheet(url);}
|
||||
else{var styles="@import url(' "+url+" ');";var newSS=document.createElement('link');newSS.rel='stylesheet';newSS.href='data:text/css,'+escape(styles);document.getElementsByTagName("head")[0].appendChild(newSS);}}
|
||||
|
||||
// jquery.listen.js
|
||||
;(function($){var a='indexer',h=$.event,j=h.special,k=$.listen=function(c,d,e,f){if(typeof d!='object'){f=e;e=d;d=document}o(c.split(/\s+/),function(a){a=k.fixes[a]||a;var b=m(d,a)||m(d,a,new n(a,d));b.append(e,f);b.start()})},m=function(b,c,d){return $.data(b,c+'.'+a,d)};$.fn[a]=function(a){return this[0]&&m(this[0],a)||null};$[a]=function(a){return m(document,a)};$.extend(k,{regex:/^((?:\w*?|\*))(?:([#.])([\w-]+))?$/,fixes:{focus:'focusin',blur:'focusout'},cache:function(a){this.caching=a}});$.each(k.fixes,function(a,b){j[b]={setup:function(){if($.browser.msie)return!1;this.addEventListener(a,j[b].handler,!0)},teardown:function(){if($.browser.msie)return!1;this.removeEventListener(a,j[b].handler,!0)},handler:function(e){arguments[0]=e=h.fix(e);e.type=b;return h.handle.apply(this,arguments)}}});$.fn.listen=function(a,b,c){return this.each(function(){k(a,this,b,c)})};function n(a,b){$.extend(this,{ids:{},tags:{},listener:b,event:a});this.id=n.instances.push(this)};n.instances=[];n.prototype={constructor:n,handle:function(e){var a=e.stopPropagation;e.stopPropagation=function(){e.stopped=1;a.apply(this,arguments)};m(this,e.type).parse(e);e.stopPropagation=a;a=e.data=null},on:0,bubbles:0,start:function(){var a=this;if(!a.on){h.add(a.listener,a.event,a.handle);a.on=1}},stop:function(){var a=this;if(a.on){h.remove(a.listener,a.event,a.handle);a.on=0}},cache:function(a,b){return $.data(a,'listenCache_'+this.id,b)},parse:function(e){var z=this,c=e.data||e.target,d=arguments,f;if(!k.caching||!(f=z.cache(c))){f=[];if(c.id&&z.ids[c.id])p(f,z.ids[c.id]);o([c.nodeName,'*'],function(a){var b=z.tags[a];if(b)o((c.className+' *').split(' '),function(a){if(a&&b[a])p(f,b[a])})});if(k.caching)z.cache(c,f)}if(f[0]){o(f,function(a){if(a.apply(c,d)===!1){e.preventDefault();e.stopPropagation()}})}if(!e.stopped&&(c=c.parentNode)&&(c.nodeName=='A'||z.bubbles&&c!=z.listener)){e.data=c;z.parse(e)}f=d=c=null},append:function(f,g){var z=this;o(f.split(/\s*,\s*/),function(a){var b=k.regex.exec(a);if(!b)throw'$.listen > "'+a+'" is not a supported selector.';var c=b[2]=='#'&&b[3],d=b[1].toUpperCase()||'*',e=b[3]||'*';if(c)(z.ids[c]||(z.ids[c]=[])).push(g);else if(d){d=z.tags[d]=z.tags[d]||{};(d[e]||(d[e]=[])).push(g)}})}};function o(a,b,c){for(var i=0,l=a.length;i<l;i++)b.call(c,a[i],i)};function p(a,b){a.push.apply(a,b);return a};$(window).unload(function(){if(typeof n=='function')o(n.instances,function(b){b.stop();$.removeData(b.listener,b.event+'.'+a);b.ids=b.names=b.listener=null})})})(jQuery);
|
||||
|
||||
// sarissa.js
|
||||
|
||||
function Sarissa(){}
|
||||
Sarissa.VERSION="0.9.9.4";Sarissa.PARSED_OK="Document contains no parsing errors";Sarissa.PARSED_EMPTY="Document is empty";Sarissa.PARSED_UNKNOWN_ERROR="Not well-formed or other error";Sarissa.IS_ENABLED_TRANSFORM_NODE=false;Sarissa.REMOTE_CALL_FLAG="gr.abiss.sarissa.REMOTE_CALL_FLAG";Sarissa._lastUniqueSuffix=0;Sarissa._getUniqueSuffix=function(){return Sarissa._lastUniqueSuffix++;};Sarissa._SARISSA_IEPREFIX4XSLPARAM="";Sarissa._SARISSA_HAS_DOM_IMPLEMENTATION=document.implementation&&true;Sarissa._SARISSA_HAS_DOM_CREATE_DOCUMENT=Sarissa._SARISSA_HAS_DOM_IMPLEMENTATION&&document.implementation.createDocument;Sarissa._SARISSA_HAS_DOM_FEATURE=Sarissa._SARISSA_HAS_DOM_IMPLEMENTATION&&document.implementation.hasFeature;Sarissa._SARISSA_IS_MOZ=Sarissa._SARISSA_HAS_DOM_CREATE_DOCUMENT&&Sarissa._SARISSA_HAS_DOM_FEATURE;Sarissa._SARISSA_IS_SAFARI=navigator.userAgent.toLowerCase().indexOf("safari")!=-1||navigator.userAgent.toLowerCase().indexOf("konqueror")!=-1;Sarissa._SARISSA_IS_SAFARI_OLD=Sarissa._SARISSA_IS_SAFARI&&(parseInt((navigator.userAgent.match(/AppleWebKit\/(\d+)/)||{})[1],10)<420);Sarissa._SARISSA_IS_IE=document.all&&window.ActiveXObject&&navigator.userAgent.toLowerCase().indexOf("msie")>-1&&navigator.userAgent.toLowerCase().indexOf("opera")==-1;Sarissa._SARISSA_IS_OPERA=navigator.userAgent.toLowerCase().indexOf("opera")!=-1;if(!window.Node||!Node.ELEMENT_NODE){Node={ELEMENT_NODE:1,ATTRIBUTE_NODE:2,TEXT_NODE:3,CDATA_SECTION_NODE:4,ENTITY_REFERENCE_NODE:5,ENTITY_NODE:6,PROCESSING_INSTRUCTION_NODE:7,COMMENT_NODE:8,DOCUMENT_NODE:9,DOCUMENT_TYPE_NODE:10,DOCUMENT_FRAGMENT_NODE:11,NOTATION_NODE:12};}
|
||||
if(Sarissa._SARISSA_IS_SAFARI_OLD){HTMLHtmlElement=document.createElement("html").constructor;Node=HTMLElement={};HTMLElement.prototype=HTMLHtmlElement.__proto__.__proto__;HTMLDocument=Document=document.constructor;var x=new DOMParser();XMLDocument=x.constructor;Element=x.parseFromString("<Single />","text/xml").documentElement.constructor;x=null;}
|
||||
if(typeof XMLDocument=="undefined"&&typeof Document!="undefined"){XMLDocument=Document;}
|
||||
if(Sarissa._SARISSA_IS_IE){Sarissa._SARISSA_IEPREFIX4XSLPARAM="xsl:";var _SARISSA_DOM_PROGID="";var _SARISSA_XMLHTTP_PROGID="";var _SARISSA_DOM_XMLWRITER="";Sarissa.pickRecentProgID=function(idList){var bFound=false,e;var o2Store;for(var i=0;i<idList.length&&!bFound;i++){try{var oDoc=new ActiveXObject(idList[i]);o2Store=idList[i];bFound=true;}catch(objException){e=objException;}}
|
||||
if(!bFound){throw"Could not retrieve a valid progID of Class: "+idList[idList.length-1]+". (original exception: "+e+")";}
|
||||
idList=null;return o2Store;};_SARISSA_DOM_PROGID=null;_SARISSA_THREADEDDOM_PROGID=null;_SARISSA_XSLTEMPLATE_PROGID=null;_SARISSA_XMLHTTP_PROGID=null;XMLHttpRequest=function(){if(!_SARISSA_XMLHTTP_PROGID){_SARISSA_XMLHTTP_PROGID=Sarissa.pickRecentProgID(["Msxml2.XMLHTTP.6.0","MSXML2.XMLHTTP.3.0","MSXML2.XMLHTTP","Microsoft.XMLHTTP"]);}
|
||||
return new ActiveXObject(_SARISSA_XMLHTTP_PROGID);};Sarissa.getDomDocument=function(sUri,sName){if(!_SARISSA_DOM_PROGID){_SARISSA_DOM_PROGID=Sarissa.pickRecentProgID(["Msxml2.DOMDocument.6.0","Msxml2.DOMDocument.3.0","MSXML2.DOMDocument","MSXML.DOMDocument","Microsoft.XMLDOM"]);}
|
||||
var oDoc=new ActiveXObject(_SARISSA_DOM_PROGID);if(sName){var prefix="";if(sUri){if(sName.indexOf(":")>1){prefix=sName.substring(0,sName.indexOf(":"));sName=sName.substring(sName.indexOf(":")+1);}else{prefix="a"+Sarissa._getUniqueSuffix();}}
|
||||
if(sUri){oDoc.loadXML('<'+prefix+':'+sName+" xmlns:"+prefix+"=\""+sUri+"\""+" />");}else{oDoc.loadXML('<'+sName+" />");}}
|
||||
return oDoc;};Sarissa.getParseErrorText=function(oDoc){var parseErrorText=Sarissa.PARSED_OK;if(oDoc&&oDoc.parseError&&oDoc.parseError.errorCode&&oDoc.parseError.errorCode!=0){parseErrorText="XML Parsing Error: "+oDoc.parseError.reason+"\nLocation: "+oDoc.parseError.url+"\nLine Number "+oDoc.parseError.line+", Column "+
|
||||
oDoc.parseError.linepos+":\n"+oDoc.parseError.srcText+"\n";for(var i=0;i<oDoc.parseError.linepos;i++){parseErrorText+="-";}
|
||||
parseErrorText+="^\n";}
|
||||
else if(oDoc.documentElement===null){parseErrorText=Sarissa.PARSED_EMPTY;}
|
||||
return parseErrorText;};Sarissa.setXpathNamespaces=function(oDoc,sNsSet){oDoc.setProperty("SelectionLanguage","XPath");oDoc.setProperty("SelectionNamespaces",sNsSet);};XSLTProcessor=function(){if(!_SARISSA_XSLTEMPLATE_PROGID){_SARISSA_XSLTEMPLATE_PROGID=Sarissa.pickRecentProgID(["Msxml2.XSLTemplate.6.0","MSXML2.XSLTemplate.3.0"]);}
|
||||
this.template=new ActiveXObject(_SARISSA_XSLTEMPLATE_PROGID);this.processor=null;};XSLTProcessor.prototype.importStylesheet=function(xslDoc){if(!_SARISSA_THREADEDDOM_PROGID){_SARISSA_THREADEDDOM_PROGID=Sarissa.pickRecentProgID(["MSXML2.FreeThreadedDOMDocument.6.0","MSXML2.FreeThreadedDOMDocument.3.0"]);}
|
||||
xslDoc.setProperty("SelectionLanguage","XPath");xslDoc.setProperty("SelectionNamespaces","xmlns:xsl='http://www.w3.org/1999/XSL/Transform'");var converted=new ActiveXObject(_SARISSA_THREADEDDOM_PROGID);try{converted.resolveExternals=true;converted.setProperty("AllowDocumentFunction",true);}
|
||||
catch(e){}
|
||||
if(xslDoc.url&&xslDoc.selectSingleNode("//xsl:*[local-name() = 'import' or local-name() = 'include']")!=null){converted.async=false;converted.load(xslDoc.url);}
|
||||
else{converted.loadXML(xslDoc.xml);}
|
||||
converted.setProperty("SelectionNamespaces","xmlns:xsl='http://www.w3.org/1999/XSL/Transform'");var output=converted.selectSingleNode("//xsl:output");if(output){this.outputMethod=output.getAttribute("method");}
|
||||
else{delete this.outputMethod;}
|
||||
this.template.stylesheet=converted;this.processor=this.template.createProcessor();this.paramsSet=[];};XSLTProcessor.prototype.transformToDocument=function(sourceDoc){var outDoc;if(_SARISSA_THREADEDDOM_PROGID){this.processor.input=sourceDoc;outDoc=new ActiveXObject(_SARISSA_DOM_PROGID);this.processor.output=outDoc;this.processor.transform();return outDoc;}
|
||||
else{if(!_SARISSA_DOM_XMLWRITER){_SARISSA_DOM_XMLWRITER=Sarissa.pickRecentProgID(["Msxml2.MXXMLWriter.6.0","Msxml2.MXXMLWriter.3.0","MSXML2.MXXMLWriter","MSXML.MXXMLWriter","Microsoft.XMLDOM"]);}
|
||||
this.processor.input=sourceDoc;outDoc=new ActiveXObject(_SARISSA_DOM_XMLWRITER);this.processor.output=outDoc;this.processor.transform();var oDoc=new ActiveXObject(_SARISSA_DOM_PROGID);oDoc.loadXML(outDoc.output+"");return oDoc;}};XSLTProcessor.prototype.transformToFragment=function(sourceDoc,ownerDoc){this.processor.input=sourceDoc;this.processor.transform();var s=this.processor.output;var f=ownerDoc.createDocumentFragment();var container;if(this.outputMethod=='text'){f.appendChild(ownerDoc.createTextNode(s));}else if(ownerDoc.body&&ownerDoc.body.innerHTML){container=ownerDoc.createElement('div');container.innerHTML=s;while(container.hasChildNodes()){f.appendChild(container.firstChild);}}
|
||||
else{var oDoc=new ActiveXObject(_SARISSA_DOM_PROGID);if(s.substring(0,5)=='<?xml'){s=s.substring(s.indexOf('?>')+2);}
|
||||
var xml=''.concat('<my>',s,'</my>');oDoc.loadXML(xml);container=oDoc.documentElement;while(container.hasChildNodes()){f.appendChild(container.firstChild);}}
|
||||
return f;};XSLTProcessor.prototype.setParameter=function(nsURI,name,value){value=value?value:"";if(nsURI){this.processor.addParameter(name,value,nsURI);}else{this.processor.addParameter(name,value);}
|
||||
nsURI=""+(nsURI||"");if(!this.paramsSet[nsURI]){this.paramsSet[nsURI]=[];}
|
||||
this.paramsSet[nsURI][name]=value;};XSLTProcessor.prototype.getParameter=function(nsURI,name){nsURI=""+(nsURI||"");if(this.paramsSet[nsURI]&&this.paramsSet[nsURI][name]){return this.paramsSet[nsURI][name];}else{return null;}};XSLTProcessor.prototype.clearParameters=function(){for(var nsURI in this.paramsSet){for(var name in this.paramsSet[nsURI]){if(nsURI!=""){this.processor.addParameter(name,"",nsURI);}else{this.processor.addParameter(name,"");}}}
|
||||
this.paramsSet=[];};}else{if(Sarissa._SARISSA_HAS_DOM_CREATE_DOCUMENT){Sarissa.__handleLoad__=function(oDoc){Sarissa.__setReadyState__(oDoc,4);};_sarissa_XMLDocument_onload=function(){Sarissa.__handleLoad__(this);};Sarissa.__setReadyState__=function(oDoc,iReadyState){oDoc.readyState=iReadyState;oDoc.readystate=iReadyState;if(oDoc.onreadystatechange!=null&&typeof oDoc.onreadystatechange=="function"){oDoc.onreadystatechange();}};Sarissa.getDomDocument=function(sUri,sName){var oDoc=document.implementation.createDocument(sUri?sUri:null,sName?sName:null,null);if(!oDoc.onreadystatechange){oDoc.onreadystatechange=null;}
|
||||
if(!oDoc.readyState){oDoc.readyState=0;}
|
||||
oDoc.addEventListener("load",_sarissa_XMLDocument_onload,false);return oDoc;};if(window.XMLDocument){}
|
||||
else if(Sarissa._SARISSA_HAS_DOM_FEATURE&&window.Document&&!Document.prototype.load&&document.implementation.hasFeature('LS','3.0')){Sarissa.getDomDocument=function(sUri,sName){var oDoc=document.implementation.createDocument(sUri?sUri:null,sName?sName:null,null);return oDoc;};}
|
||||
else{Sarissa.getDomDocument=function(sUri,sName){var oDoc=document.implementation.createDocument(sUri?sUri:null,sName?sName:null,null);if(oDoc&&(sUri||sName)&&!oDoc.documentElement){oDoc.appendChild(oDoc.createElementNS(sUri,sName));}
|
||||
return oDoc;};}}}
|
||||
if(!window.DOMParser){if(Sarissa._SARISSA_IS_SAFARI){DOMParser=function(){};DOMParser.prototype.parseFromString=function(sXml,contentType){var xmlhttp=new XMLHttpRequest();xmlhttp.open("GET","data:text/xml;charset=utf-8,"+encodeURIComponent(sXml),false);xmlhttp.send(null);return xmlhttp.responseXML;};}else if(Sarissa.getDomDocument&&Sarissa.getDomDocument()&&Sarissa.getDomDocument(null,"bar").xml){DOMParser=function(){};DOMParser.prototype.parseFromString=function(sXml,contentType){var doc=Sarissa.getDomDocument();doc.loadXML(sXml);return doc;};}}
|
||||
if((typeof(document.importNode)=="undefined")&&Sarissa._SARISSA_IS_IE){try{document.importNode=function(oNode,bChildren){var tmp;if(oNode.nodeName=='#text'){return document.createTextNode(oNode.data);}
|
||||
else{if(oNode.nodeName=="tbody"||oNode.nodeName=="tr"){tmp=document.createElement("table");}
|
||||
else if(oNode.nodeName=="td"){tmp=document.createElement("tr");}
|
||||
else if(oNode.nodeName=="option"){tmp=document.createElement("select");}
|
||||
else{tmp=document.createElement("div");}
|
||||
if(bChildren){tmp.innerHTML=oNode.xml?oNode.xml:oNode.outerHTML;}else{tmp.innerHTML=oNode.xml?oNode.cloneNode(false).xml:oNode.cloneNode(false).outerHTML;}
|
||||
return tmp.getElementsByTagName("*")[0];}};}catch(e){}}
|
||||
if(!Sarissa.getParseErrorText){Sarissa.getParseErrorText=function(oDoc){var parseErrorText=Sarissa.PARSED_OK;if((!oDoc)||(!oDoc.documentElement)){parseErrorText=Sarissa.PARSED_EMPTY;}else if(oDoc.documentElement.tagName=="parsererror"){parseErrorText=oDoc.documentElement.firstChild.data;parseErrorText+="\n"+oDoc.documentElement.firstChild.nextSibling.firstChild.data;}else if(oDoc.getElementsByTagName("parsererror").length>0){var parsererror=oDoc.getElementsByTagName("parsererror")[0];parseErrorText=Sarissa.getText(parsererror,true)+"\n";}else if(oDoc.parseError&&oDoc.parseError.errorCode!=0){parseErrorText=Sarissa.PARSED_UNKNOWN_ERROR;}
|
||||
return parseErrorText;};}
|
||||
Sarissa.getText=function(oNode,deep){var s="";var nodes=oNode.childNodes;for(var i=0;i<nodes.length;i++){var node=nodes[i];var nodeType=node.nodeType;if(nodeType==Node.TEXT_NODE||nodeType==Node.CDATA_SECTION_NODE){s+=node.data;}else if(deep===true&&(nodeType==Node.ELEMENT_NODE||nodeType==Node.DOCUMENT_NODE||nodeType==Node.DOCUMENT_FRAGMENT_NODE)){s+=Sarissa.getText(node,true);}}
|
||||
return s;};if(!window.XMLSerializer&&Sarissa.getDomDocument&&Sarissa.getDomDocument("","foo",null).xml){XMLSerializer=function(){};XMLSerializer.prototype.serializeToString=function(oNode){return oNode.xml;};}
|
||||
Sarissa.stripTags=function(s){return s?s.replace(/<[^>]+>/g,""):s;};Sarissa.clearChildNodes=function(oNode){while(oNode.firstChild){oNode.removeChild(oNode.firstChild);}};Sarissa.copyChildNodes=function(nodeFrom,nodeTo,bPreserveExisting){if(Sarissa._SARISSA_IS_SAFARI&&nodeTo.nodeType==Node.DOCUMENT_NODE){nodeTo=nodeTo.documentElement;}
|
||||
if((!nodeFrom)||(!nodeTo)){throw"Both source and destination nodes must be provided";}
|
||||
if(!bPreserveExisting){Sarissa.clearChildNodes(nodeTo);}
|
||||
var ownerDoc=nodeTo.nodeType==Node.DOCUMENT_NODE?nodeTo:nodeTo.ownerDocument;var nodes=nodeFrom.childNodes;var i;if(typeof(ownerDoc.importNode)!="undefined"){for(i=0;i<nodes.length;i++){nodeTo.appendChild(ownerDoc.importNode(nodes[i],true));}}else{for(i=0;i<nodes.length;i++){nodeTo.appendChild(nodes[i].cloneNode(true));}}};Sarissa.moveChildNodes=function(nodeFrom,nodeTo,bPreserveExisting){if((!nodeFrom)||(!nodeTo)){throw"Both source and destination nodes must be provided";}
|
||||
if(!bPreserveExisting){Sarissa.clearChildNodes(nodeTo);}
|
||||
var nodes=nodeFrom.childNodes;if(nodeFrom.ownerDocument==nodeTo.ownerDocument){while(nodeFrom.firstChild){nodeTo.appendChild(nodeFrom.firstChild);}}else{var ownerDoc=nodeTo.nodeType==Node.DOCUMENT_NODE?nodeTo:nodeTo.ownerDocument;var i;if(typeof(ownerDoc.importNode)!="undefined"){for(i=0;i<nodes.length;i++){nodeTo.appendChild(ownerDoc.importNode(nodes[i],true));}}else{for(i=0;i<nodes.length;i++){nodeTo.appendChild(nodes[i].cloneNode(true));}}
|
||||
Sarissa.clearChildNodes(nodeFrom);}};Sarissa.xmlize=function(anyObject,objectName,indentSpace){indentSpace=indentSpace?indentSpace:'';var s=indentSpace+'<'+objectName+'>';var isLeaf=false;if(!(anyObject instanceof Object)||anyObject instanceof Number||anyObject instanceof String||anyObject instanceof Boolean||anyObject instanceof Date){s+=Sarissa.escape(""+anyObject);isLeaf=true;}else{s+="\n";var isArrayItem=anyObject instanceof Array;for(var name in anyObject){s+=Sarissa.xmlize(anyObject[name],(isArrayItem?"array-item key=\""+name+"\"":name),indentSpace+" ");}
|
||||
s+=indentSpace;}
|
||||
return(s+=(objectName.indexOf(' ')!=-1?"</array-item>\n":"</"+objectName+">\n"));};Sarissa.escape=function(sXml){return sXml.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'");};Sarissa.unescape=function(sXml){return sXml.replace(/'/g,"'").replace(/"/g,"\"").replace(/>/g,">").replace(/</g,"<").replace(/&/g,"&");};Sarissa.updateCursor=function(oTargetElement,sValue){if(oTargetElement&&oTargetElement.style&&oTargetElement.style.cursor!=undefined){oTargetElement.style.cursor=sValue;}};Sarissa.updateContentFromURI=function(sFromUrl,oTargetElement,xsltproc,callback,skipCache){try{Sarissa.updateCursor(oTargetElement,"wait");var xmlhttp=new XMLHttpRequest();xmlhttp.open("GET",sFromUrl,true);xmlhttp.onreadystatechange=function(){if(xmlhttp.readyState==4){try{var oDomDoc=xmlhttp.responseXML;if(oDomDoc&&Sarissa.getParseErrorText(oDomDoc)==Sarissa.PARSED_OK){Sarissa.updateContentFromNode(xmlhttp.responseXML,oTargetElement,xsltproc);if(callback){callback(sFromUrl,oTargetElement);}}
|
||||
else{throw Sarissa.getParseErrorText(oDomDoc);}}
|
||||
catch(e){if(callback){callback(sFromUrl,oTargetElement,e);}
|
||||
else{throw e;}}}};if(skipCache){var oldage="Sat, 1 Jan 2000 00:00:00 GMT";xmlhttp.setRequestHeader("If-Modified-Since",oldage);}
|
||||
xmlhttp.send("");}
|
||||
catch(e){Sarissa.updateCursor(oTargetElement,"auto");if(callback){callback(sFromUrl,oTargetElement,e);}
|
||||
else{throw e;}}};Sarissa.updateContentFromNode=function(oNode,oTargetElement,xsltproc){try{Sarissa.updateCursor(oTargetElement,"wait");Sarissa.clearChildNodes(oTargetElement);var ownerDoc=oNode.nodeType==Node.DOCUMENT_NODE?oNode:oNode.ownerDocument;if(ownerDoc.parseError&&ownerDoc.parseError.errorCode!=0){var pre=document.createElement("pre");pre.appendChild(document.createTextNode(Sarissa.getParseErrorText(ownerDoc)));oTargetElement.appendChild(pre);}
|
||||
else{if(xsltproc){oNode=xsltproc.transformToDocument(oNode);}
|
||||
if(oTargetElement.tagName.toLowerCase()=="textarea"||oTargetElement.tagName.toLowerCase()=="input"){oTargetElement.value=new XMLSerializer().serializeToString(oNode);}
|
||||
else{try{oTargetElement.appendChild(oTargetElement.ownerDocument.importNode(oNode,true));}
|
||||
catch(e){oTargetElement.innerHTML=new XMLSerializer().serializeToString(oNode);}}}}
|
||||
catch(e){throw e;}
|
||||
finally{Sarissa.updateCursor(oTargetElement,"auto");}};Sarissa.formToQueryString=function(oForm){var qs="";for(var i=0;i<oForm.elements.length;i++){var oField=oForm.elements[i];var sFieldName=oField.getAttribute("name")?oField.getAttribute("name"):oField.getAttribute("id");if(sFieldName&&((!oField.disabled)||oField.type=="hidden")){switch(oField.type){case"hidden":case"text":case"textarea":case"password":qs+=sFieldName+"="+encodeURIComponent(oField.value)+"&";break;case"select-one":qs+=sFieldName+"="+encodeURIComponent(oField.options[oField.selectedIndex].value)+"&";break;case"select-multiple":for(var j=0;j<oField.length;j++){var optElem=oField.options[j];if(optElem.selected===true){qs+=sFieldName+"[]"+"="+encodeURIComponent(optElem.value)+"&";}}
|
||||
break;case"checkbox":case"radio":if(oField.checked){qs+=sFieldName+"="+encodeURIComponent(oField.value)+"&";}
|
||||
break;}}}
|
||||
return qs.substr(0,qs.length-1);};Sarissa.updateContentFromForm=function(oForm,oTargetElement,xsltproc,callback){try{Sarissa.updateCursor(oTargetElement,"wait");var params=Sarissa.formToQueryString(oForm)+"&"+Sarissa.REMOTE_CALL_FLAG+"=true";var xmlhttp=new XMLHttpRequest();var bUseGet=oForm.getAttribute("method")&&oForm.getAttribute("method").toLowerCase()=="get";if(bUseGet){xmlhttp.open("GET",oForm.getAttribute("action")+"?"+params,true);}
|
||||
else{xmlhttp.open('POST',oForm.getAttribute("action"),true);xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");xmlhttp.setRequestHeader("Content-length",params.length);xmlhttp.setRequestHeader("Connection","close");}
|
||||
xmlhttp.onreadystatechange=function(){try{if(xmlhttp.readyState==4){var oDomDoc=xmlhttp.responseXML;if(oDomDoc&&Sarissa.getParseErrorText(oDomDoc)==Sarissa.PARSED_OK){Sarissa.updateContentFromNode(xmlhttp.responseXML,oTargetElement,xsltproc);if(callback){callback(oForm,oTargetElement);}}
|
||||
else{throw Sarissa.getParseErrorText(oDomDoc);}}}
|
||||
catch(e){if(callback){callback(oForm,oTargetElement,e);}
|
||||
else{throw e;}}};xmlhttp.send(bUseGet?"":params);}
|
||||
catch(e){Sarissa.updateCursor(oTargetElement,"auto");if(callback){callback(oForm,oTargetElement,e);}
|
||||
else{throw e;}}
|
||||
return false;};Sarissa.FUNCTION_NAME_REGEXP=new RegExp("");Sarissa.getFunctionName=function(oFunc,bForce){var name;if(!name){if(bForce){name="SarissaAnonymous"+Sarissa._getUniqueSuffix();window[name]=oFunc;}
|
||||
else{name=null;}}
|
||||
if(name){window[name]=oFunc;}
|
||||
return name;};Sarissa.setRemoteJsonCallback=function(url,callback,callbackParam){if(!callbackParam){callbackParam="callback";}
|
||||
var callbackFunctionName=Sarissa.getFunctionName(callback,true);var id="sarissa_json_script_id_"+Sarissa._getUniqueSuffix();var oHead=document.getElementsByTagName("head")[0];var scriptTag=document.createElement('script');scriptTag.type='text/javascript';scriptTag.id=id;scriptTag.onload=function(){};if(url.indexOf("?")!=-1){url+=("&"+callbackParam+"="+callbackFunctionName);}
|
||||
else{url+=("?"+callbackParam+"="+callbackFunctionName);}
|
||||
scriptTag.src=url;oHead.appendChild(scriptTag);return id;};
|
||||
|
||||
// sarissa_ieemu_xpath.js
|
||||
|
||||
if(Sarissa._SARISSA_HAS_DOM_FEATURE&&document.implementation.hasFeature("XPath","3.0")){SarissaNodeList=function(i){this.length=i;};SarissaNodeList.prototype=[];SarissaNodeList.prototype.constructor=Array;SarissaNodeList.prototype.item=function(i){return(i<0||i>=this.length)?null:this[i];};SarissaNodeList.prototype.expr="";if(window.XMLDocument&&(!XMLDocument.prototype.setProperty)){XMLDocument.prototype.setProperty=function(x,y){};}
|
||||
Sarissa.setXpathNamespaces=function(oDoc,sNsSet){oDoc._sarissa_useCustomResolver=true;var namespaces=sNsSet.indexOf(" ")>-1?sNsSet.split(" "):[sNsSet];oDoc._sarissa_xpathNamespaces=[];for(var i=0;i<namespaces.length;i++){var ns=namespaces[i];var colonPos=ns.indexOf(":");var assignPos=ns.indexOf("=");if(colonPos>0&&assignPos>colonPos+1){var prefix=ns.substring(colonPos+1,assignPos);var uri=ns.substring(assignPos+2,ns.length-1);oDoc._sarissa_xpathNamespaces[prefix]=uri;}else{throw"Bad format on namespace declaration(s) given";}}};XMLDocument.prototype._sarissa_useCustomResolver=false;XMLDocument.prototype._sarissa_xpathNamespaces=[];XMLDocument.prototype.selectNodes=function(sExpr,contextNode,returnSingle){var nsDoc=this;var nsresolver;if(this._sarissa_useCustomResolver){nsresolver=function(prefix){var s=nsDoc._sarissa_xpathNamespaces[prefix];if(s){return s;}
|
||||
else{throw"No namespace URI found for prefix: '"+prefix+"'";}};}
|
||||
else{nsresolver=this.createNSResolver(this.documentElement);}
|
||||
var result=null;if(!returnSingle){var oResult=this.evaluate(sExpr,(contextNode?contextNode:this),nsresolver,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null);var nodeList=new SarissaNodeList(oResult.snapshotLength);nodeList.expr=sExpr;for(var i=0;i<nodeList.length;i++){nodeList[i]=oResult.snapshotItem(i);}
|
||||
result=nodeList;}
|
||||
else{result=this.evaluate(sExpr,(contextNode?contextNode:this),nsresolver,XPathResult.FIRST_ORDERED_NODE_TYPE,null).singleNodeValue;}
|
||||
return result;};Element.prototype.selectNodes=function(sExpr){var doc=this.ownerDocument;if(doc.selectNodes){return doc.selectNodes(sExpr,this);}
|
||||
else{throw"Method selectNodes is only supported by XML Elements";}};XMLDocument.prototype.selectSingleNode=function(sExpr,contextNode){var ctx=contextNode?contextNode:null;return this.selectNodes(sExpr,ctx,true);};Element.prototype.selectSingleNode=function(sExpr){var doc=this.ownerDocument;if(doc.selectSingleNode){return doc.selectSingleNode(sExpr,this);}
|
||||
else{throw"Method selectNodes is only supported by XML Elements";}};Sarissa.IS_ENABLED_SELECT_NODES=true;}
|
||||
|
||||
// jquery.xslt.js
|
||||
|
||||
var xslTransform={version:20071203,debug:false,init:function(){try{parseFloat(jQuery.fn.jquery)>=1;}catch(e){alert('xslTransform requires jQuery 1.0.4 or greater ... please load it prior to xslTransform');}
|
||||
try{Sarissa;}catch(e){alert('Missing Sarissa ... please load it prior to xslTransform');}
|
||||
if(!jQuery.log){jQuery.log=function(){};jQuery.fn.debug=function(){};}
|
||||
if(this.debug)jQuery.log('xslTransform:init(): version '+xslTransform.version);},XMLSerializer:new XMLSerializer(),serialize:function(data){if(this.debug)jQuery.log('serialize(): received '+typeof(data));if(typeof(data)=='string'){return data;}
|
||||
return this.XMLSerializer.serializeToString(data);},load:function(xml,meth){if(this.debug)jQuery.log('load(): received '+typeof(xml));var r;if(typeof(xml)=='object'){return xml;}
|
||||
if(xml.substring(0,1)=='<'){r=this.loadString(xml);}else{r=this.loadFile(xml,meth);}
|
||||
if(r){r.setProperty('SelectionNamespaces','xmlns:xsl="http://www.w3.org/1999/XSL/Transform"');r.setProperty('SelectionLanguage','XPath');return r;}else{if(this.debug)$.log('Unable to load '+xml);return false;}},loadString:function(str){if(this.debug)jQuery.log('loadString(): '+str+'::'+typeof(str));var p=new DOMParser();var xml=p.parseFromString(str,'text/xml');if(!xml){if(this.debug)jQuery.log('loadString(): parseFromString() failed');return false;}
|
||||
return xml;},loadFile:function(url,meth){if(this.debug)jQuery.log('loadFile(): '+url+'::'+typeof(url));if(!url){if(this.debug)jQuery.log('ERROR: loadFile() missing url');return false;}
|
||||
var doc;this.xhrsuccess=function(data,str){if(this.debug)jQuery.log('loadFile() completed successfully ('+str+')');doc=data;return true;};this.xhrerror=function(xhr,err){window.DEBUG=true;if(this.debug)jQuery.log('loadFile() failed to load the requested file: ('+err+') - xml: '+xhr.responseXML+' - text: '+xhr.responseText);doc=null;return false;};if(!meth)meth="GET";$.ajax({type:meth,url:url,async:false,success:this.xhrsuccess,error:this.xhrerror});if(!doc){if(this.debug)jQuery.log('ERROR: document '+url+' not found (404), or unable to load');return false;}
|
||||
if(doc.length==0){if(this.debug)jQuery.log('ERROR: document '+url+' loaded in loadFile() has no data');return false;}
|
||||
return doc;},transform:function(xsl,xml,options){var log={'xsl':xsl,'xml':xml,'options':options};if(this.debug)jQuery.log('transform(): '+xsl+'::'+xml+'::'+options.toString());options=options||{};var xml={'request':xml,'doc':this.load(xml,options.meth)};if(options.xpath&&xml.doc&&!jQuery.browser.msie){xml.doc=xml.doc.selectSingleNode(options.xpath.toString());if(this.debug)$.log('transform(): xpath has been run...resulting doc: '+(this.serialize(xml.doc)));}
|
||||
var result={'xsl':this.load(xsl,options.meth)};result.json=false;if(options.json&&xml.doc){result.json=xml.doc.selectSingleNode(options.json.toString());}
|
||||
var processor=new XSLTProcessor();processor.importStylesheet(result.xsl);if(options.params&&processor){if(this.debug)jQuery.log('transform(): received xsl params: '+options.params.toString());for(key in options.params){processor.setParameter(null,key.toString(),options.params[key].toString());}}
|
||||
result.doc=processor.transformToDocument(xml.doc);var errorTxt=Sarissa.getParseErrorText(result.doc);if(this.debug)jQuery.log('transform(): Sarissa parse text: '+errorTxt);if(errorTxt!=Sarissa.PARSED_OK){result.string=Sarissa.getParseErrorText(result.doc)+' :: using '+xsl+' => '+xml.request;if(this.debug)jQuery.log('transform(): error in transformation: '+Sarissa.getParseErrorText(result.doc));return result;}
|
||||
result.string=this.serialize(result.doc);result.scripts=jQuery('script',result.doc).text();return result;}};xslTransform.init();jQuery.fn.getTransform=function(xsl,xml,options){var settings={append:false,params:{},xpath:'',eval:true,callback:'',json:false,meth:"GET"};jQuery.extend(settings,options);if(xslTransform.debug)jQuery.log('getTransform: '+xsl+'::'+xml+'::'+settings.toString());if(!xsl||!xml){if(xslTransform.debug)jQuery.log('getTransform: missing xsl or xml');return;}
|
||||
return this.each(function(){var trans=xslTransform.transform(xsl,xml,settings);var re=trans.string.match(/<\?xml.*?\?>/);if(re){trans.string=trans.string.replace(re,'');if(xslTransform.debug)jQuery.log('getTransform(): found an xml declaration and removed it');}
|
||||
try{if(settings.append)$(this).append(trans.string);else if(settings.repl)$(this).replaceWith(trans.string);else $(this).html(trans.string);}catch(e){if(xslTransform.debug)$.log('getTransform: error placing results of transform into element, falling back to innerHTML: '+e.toString());$(this)[0].innerHTML=trans.string;}
|
||||
if(settings.eval&&trans.scripts){if(trans.scripts.length>0){if(xslTransform.debug)jQuery.log('Found text/javascript in transformed result');eval.call(window,trans.scripts);}}
|
||||
if(settings.callback&&jQuery.isFunction(settings.callback)){var json=false;if(settings.json&&trans.json)eval("json = "+trans.json.firstChild.data);settings.callback.apply(window,[trans.string,json]);}});};
|
||||
|
||||
// jquery.metadata.js
|
||||
|
||||
(function($){$.extend({metadata:{defaults:{type:'class',name:'metadata',cre:/({.*})/,single:'metadata'},setType:function(type,name){this.defaults.type=type;this.defaults.name=name;},get:function(elem,opts){var settings=$.extend({},this.defaults,opts);if(!settings.single.length)settings.single='metadata';var data=$.data(elem,settings.single);if(data)return data;data="{}";if(settings.type=="class"){var m=settings.cre.exec(elem.className);if(m)
|
||||
data=m[1];}else if(settings.type=="elem"){if(!elem.getElementsByTagName)
|
||||
return undefined;var e=elem.getElementsByTagName(settings.name);if(e.length)
|
||||
data=$.trim(e[0].innerHTML);}else if(elem.getAttribute!=undefined){var attr=elem.getAttribute(settings.name);if(attr)
|
||||
data=attr;}
|
||||
if(data.indexOf('{')<0)
|
||||
data="{"+data+"}";data=eval("("+data+")");$.data(elem,settings.single,data);return data;}}});$.fn.metadata=function(opts){return $.metadata.get(this[0],opts);};})(jQuery);
|
||||
|
||||
// jquery.cookie.js
|
||||
|
||||
jQuery.cookie=function(name,value,options){if(typeof value!='undefined'){options=options||{};if(value===null){value='';options.expires=-1;}
|
||||
var expires='';if(options.expires&&(typeof options.expires=='number'||options.expires.toUTCString)){var date;if(typeof options.expires=='number'){date=new Date();date.setTime(date.getTime()+(options.expires*24*60*60*1000));}else{date=options.expires;}
|
||||
expires='; expires='+date.toUTCString();}
|
||||
var path=options.path?'; path='+(options.path):'';var domain=options.domain?'; domain='+(options.domain):'';var secure=options.secure?'; secure':'';document.cookie=[name,'=',encodeURIComponent(value),expires,path,domain,secure].join('');}else{var cookieValue=null;if(document.cookie&&document.cookie!=''){var cookies=document.cookie.split(';');for(var i=0;i<cookies.length;i++){var cookie=jQuery.trim(cookies[i]);if(cookie.substring(0,name.length+1)==(name+'=')){cookieValue=decodeURIComponent(cookie.substring(name.length+1));break;}}}
|
||||
return cookieValue;}};
|
||||
46
static/cms/js/jstree/_lib/css.js
Normal file
|
|
@ -0,0 +1,46 @@
|
|||
function get_css(rule_name, stylesheet, delete_flag) {
|
||||
if (!document.styleSheets) return false;
|
||||
rule_name = rule_name.toLowerCase(); stylesheet = stylesheet || 0;
|
||||
for (var i = stylesheet; i < document.styleSheets.length; i++) {
|
||||
var styleSheet = document.styleSheets[i]; css_rules = document.styleSheets[i].cssRules || document.styleSheets[i].rules;
|
||||
if(!css_rules) continue;
|
||||
var j = 0;
|
||||
do {
|
||||
if(css_rules[j].selectorText.toLowerCase() == rule_name) {
|
||||
if(delete_flag == true) {
|
||||
if(document.styleSheets[i].removeRule) document.styleSheets[i].removeRule(j);
|
||||
if(document.styleSheets[i].deleteRule) document.styleSheets[i].deleteRule(j);
|
||||
return true;
|
||||
}
|
||||
else return css_rules[j];
|
||||
}
|
||||
}
|
||||
while (css_rules[++j]);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
function add_css(rule_name, stylesheet) {
|
||||
rule_name = rule_name.toLowerCase(); stylesheet = stylesheet || 0;
|
||||
if (!document.styleSheets || get_css(rule_name, stylesheet)) return false;
|
||||
(document.styleSheets[stylesheet].addRule) ? document.styleSheets[stylesheet].addRule(rule_name, null, 0) : document.styleSheets[stylesheet].insertRule(rule_name+' { }', 0);
|
||||
return get_css(rule_name);
|
||||
}
|
||||
function get_sheet_num (href_name) {
|
||||
if (!document.styleSheets) return false;
|
||||
for (var i = 0; i < document.styleSheets.length; i++) { if(document.styleSheets[i].href && document.styleSheets[i].href.toString().match(href_name)) return i; }
|
||||
return false;
|
||||
}
|
||||
function remove_css(rule_name, stylesheet) { return get_css(rule_name, stylesheet, true); }
|
||||
|
||||
function add_sheet(url) {
|
||||
if(document.createStyleSheet) {
|
||||
document.createStyleSheet(url);
|
||||
}
|
||||
else {
|
||||
var styles = "@import url(' " + url + " ');";
|
||||
var newSS = document.createElement('link');
|
||||
newSS.rel ='stylesheet';
|
||||
newSS.href ='data:text/css,'+escape(styles);
|
||||
document.getElementsByTagName("head")[0].appendChild(newSS);
|
||||
}
|
||||
}
|
||||
96
static/cms/js/jstree/_lib/jquery.cookie.js
Normal file
|
|
@ -0,0 +1,96 @@
|
|||
/**
|
||||
* Cookie plugin
|
||||
*
|
||||
* Copyright (c) 2006 Klaus Hartl (stilbuero.de)
|
||||
* Dual licensed under the MIT and GPL licenses:
|
||||
* http://www.opensource.org/licenses/mit-license.php
|
||||
* http://www.gnu.org/licenses/gpl.html
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* Create a cookie with the given name and value and other optional parameters.
|
||||
*
|
||||
* @example $.cookie('the_cookie', 'the_value');
|
||||
* @desc Set the value of a cookie.
|
||||
* @example $.cookie('the_cookie', 'the_value', { expires: 7, path: '/', domain: 'jquery.com', secure: true });
|
||||
* @desc Create a cookie with all available options.
|
||||
* @example $.cookie('the_cookie', 'the_value');
|
||||
* @desc Create a session cookie.
|
||||
* @example $.cookie('the_cookie', null);
|
||||
* @desc Delete a cookie by passing null as value. Keep in mind that you have to use the same path and domain
|
||||
* used when the cookie was set.
|
||||
*
|
||||
* @param String name The name of the cookie.
|
||||
* @param String value The value of the cookie.
|
||||
* @param Object options An object literal containing key/value pairs to provide optional cookie attributes.
|
||||
* @option Number|Date expires Either an integer specifying the expiration date from now on in days or a Date object.
|
||||
* If a negative value is specified (e.g. a date in the past), the cookie will be deleted.
|
||||
* If set to null or omitted, the cookie will be a session cookie and will not be retained
|
||||
* when the the browser exits.
|
||||
* @option String path The value of the path atribute of the cookie (default: path of page that created the cookie).
|
||||
* @option String domain The value of the domain attribute of the cookie (default: domain of page that created the cookie).
|
||||
* @option Boolean secure If true, the secure attribute of the cookie will be set and the cookie transmission will
|
||||
* require a secure protocol (like HTTPS).
|
||||
* @type undefined
|
||||
*
|
||||
* @name $.cookie
|
||||
* @cat Plugins/Cookie
|
||||
* @author Klaus Hartl/klaus.hartl@stilbuero.de
|
||||
*/
|
||||
|
||||
/**
|
||||
* Get the value of a cookie with the given name.
|
||||
*
|
||||
* @example $.cookie('the_cookie');
|
||||
* @desc Get the value of a cookie.
|
||||
*
|
||||
* @param String name The name of the cookie.
|
||||
* @return The value of the cookie.
|
||||
* @type String
|
||||
*
|
||||
* @name $.cookie
|
||||
* @cat Plugins/Cookie
|
||||
* @author Klaus Hartl/klaus.hartl@stilbuero.de
|
||||
*/
|
||||
jQuery.cookie = function(name, value, options) {
|
||||
if (typeof value != 'undefined') { // name and value given, set cookie
|
||||
options = options || {};
|
||||
if (value === null) {
|
||||
value = '';
|
||||
options.expires = -1;
|
||||
}
|
||||
var expires = '';
|
||||
if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) {
|
||||
var date;
|
||||
if (typeof options.expires == 'number') {
|
||||
date = new Date();
|
||||
date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000));
|
||||
} else {
|
||||
date = options.expires;
|
||||
}
|
||||
expires = '; expires=' + date.toUTCString(); // use expires attribute, max-age is not supported by IE
|
||||
}
|
||||
// CAUTION: Needed to parenthesize options.path and options.domain
|
||||
// in the following expressions, otherwise they evaluate to undefined
|
||||
// in the packed version for some reason...
|
||||
var path = options.path ? '; path=' + (options.path) : '';
|
||||
var domain = options.domain ? '; domain=' + (options.domain) : '';
|
||||
var secure = options.secure ? '; secure' : '';
|
||||
document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join('');
|
||||
} else { // only name given, get cookie
|
||||
var cookieValue = null;
|
||||
if (document.cookie && document.cookie != '') {
|
||||
var cookies = document.cookie.split(';');
|
||||
for (var i = 0; i < cookies.length; i++) {
|
||||
var cookie = jQuery.trim(cookies[i]);
|
||||
// Does this cookie string begin with the name we want?
|
||||
if (cookie.substring(0, name.length + 1) == (name + '=')) {
|
||||
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return cookieValue;
|
||||
}
|
||||
};
|
||||
121
static/cms/js/jstree/_lib/jquery.hotkeys.js
Normal file
|
|
@ -0,0 +1,121 @@
|
|||
/**
|
||||
* @ Original code by by Binny V A, Original version: 2.00.A
|
||||
* @ http://www.openjs.com/scripts/events/keyboard_shortcuts/
|
||||
* @ Original License : BSD
|
||||
* @ jQuery Plugin by Tzury Bar Yochay
|
||||
tzury.by@gmail.com
|
||||
evalinux.wordpress.com
|
||||
facebook.com/profile.php?id=513676303
|
||||
* @ jQuery Plugin version Beta (0.0.2)
|
||||
* @ License: Whatever feats in between jQuery-License + BSD-License
|
||||
|
||||
TODO:
|
||||
add queue support (as in gmail) e.g. 'x' then 'y', etc.
|
||||
add mouse + mouse wheel events.
|
||||
|
||||
Usage:
|
||||
jQuery.hotkeys.add('Ctrl+c', function(){ alert('copy anyone?');});
|
||||
jQuery.hotkeys.add('Ctrl+c', {target:'div#editor', type:'keyup', propagate: true},function(){ alert('copy anyone?');});
|
||||
jQuery.hotkeys.remove('Ctrl+c');
|
||||
*/
|
||||
|
||||
(function (jQuery){
|
||||
this.version = '(beta)(0.0.2)';
|
||||
this.all = {};
|
||||
this.special_keys = {
|
||||
27: 'esc', 9: 'tab', 32:'space', 13: 'return', 8:'backspace', 145: 'scroll', 20: 'capslock',
|
||||
144: 'numlock', 19:'pause', 45:'insert', 36:'home', 46:'del',35:'end', 33: 'pageup',
|
||||
34:'pagedown', 37:'left', 38:'up', 39:'right',40:'down', 112:'f1',113:'f2', 114:'f3',
|
||||
115:'f4', 116:'f5', 117:'f6', 118:'f7', 119:'f8', 120:'f9', 121:'f10', 122:'f11', 123:'f12'};
|
||||
|
||||
this.shift_nums = { "`":"~", "1":"!", "2":"@", "3":"#", "4":"$", "5":"%", "6":"^", "7":"&",
|
||||
"8":"*", "9":"(", "0":")", "-":"_", "=":"+", ";":":", "'":"\"", ",":"<",
|
||||
".":">", "/":"?", "\\":"|" };
|
||||
|
||||
this.add = function(combi, options, callback) {
|
||||
if (jQuery.isFunction(options)){
|
||||
callback = options;
|
||||
options = {};
|
||||
}
|
||||
var opt = {},
|
||||
defaults = {type: 'keydown', propagate: false, disableInInput: false, target: jQuery('html')[0]},
|
||||
that = this;
|
||||
opt = jQuery.extend( opt , defaults, options || {} );
|
||||
combi = combi.toLowerCase();
|
||||
|
||||
// inspect if key keystroke matches
|
||||
var inspector = function(event) {
|
||||
event = jQuery.event.fix(event); // jQuery event normalization.
|
||||
var element = event.target;
|
||||
// @ TextNode -> nodeType == 3
|
||||
element = (element.nodeType==3) ? element.parentNode : element;
|
||||
|
||||
if(opt['disableInInput']) { // Disable shortcut keys in Input, Textarea fields
|
||||
var target = jQuery(element);
|
||||
if( target.is("input") || target.is("textarea")){
|
||||
return;
|
||||
}
|
||||
}
|
||||
var code = event.which,
|
||||
type = event.type,
|
||||
character = String.fromCharCode(code).toLowerCase(),
|
||||
special = that.special_keys[code],
|
||||
shift = event.shiftKey,
|
||||
ctrl = event.ctrlKey,
|
||||
alt= event.altKey,
|
||||
propagate = true, // default behaivour
|
||||
mapPoint = null;
|
||||
|
||||
// in opera + safari, the event.target is unpredictable.
|
||||
// for example: 'keydown' might be associated with HtmlBodyElement
|
||||
// or the element where you last clicked with your mouse.
|
||||
if (jQuery.browser.opera || jQuery.browser.safari){
|
||||
while (!that.all[element] && element.parentNode){
|
||||
element = element.parentNode;
|
||||
}
|
||||
}
|
||||
|
||||
var cbMap = that.all[element].events[type].callbackMap;
|
||||
if(!shift && !ctrl && !alt) { // No Modifiers
|
||||
mapPoint = cbMap[special] || cbMap[character]
|
||||
}
|
||||
// deals with combinaitons (alt|ctrl|shift+anything)
|
||||
else{
|
||||
var modif = '';
|
||||
if(alt) modif +='alt+';
|
||||
if(ctrl) modif+= 'ctrl+';
|
||||
if(shift) modif += 'shift+';
|
||||
// modifiers + special keys or modifiers + characters or modifiers + shift characters
|
||||
mapPoint = cbMap[modif+special] || cbMap[modif+character] || cbMap[modif+that.shift_nums[character]]
|
||||
}
|
||||
if (mapPoint){
|
||||
mapPoint.cb(event);
|
||||
if(!mapPoint.propagate) {
|
||||
event.stopPropagation();
|
||||
event.preventDefault();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
};
|
||||
// first hook for this element
|
||||
if (!this.all[opt.target]){
|
||||
this.all[opt.target] = {events:{}};
|
||||
}
|
||||
if (!this.all[opt.target].events[opt.type]){
|
||||
this.all[opt.target].events[opt.type] = {callbackMap: {}}
|
||||
jQuery.event.add(opt.target, opt.type, inspector);
|
||||
}
|
||||
this.all[opt.target].events[opt.type].callbackMap[combi] = {cb: callback, propagate:opt.propagate};
|
||||
return jQuery;
|
||||
};
|
||||
this.remove = function(exp, opt) {
|
||||
opt = opt || {};
|
||||
target = opt.target || jQuery('html')[0];
|
||||
type = opt.type || 'keydown';
|
||||
exp = exp.toLowerCase();
|
||||
delete this.all[target].events[type].callbackMap[exp]
|
||||
return jQuery;
|
||||
};
|
||||
jQuery.hotkeys = this;
|
||||
return jQuery;
|
||||
})(jQuery);
|
||||
32
static/cms/js/jstree/_lib/jquery.js
vendored
Normal file
9
static/cms/js/jstree/_lib/jquery.listen.js
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
/**
|
||||
* jQuery.Listen - Light and fast event handling, using event delegation.
|
||||
* Copyright (c) 2007-2008 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com
|
||||
* Dual licensed under MIT and GPL.
|
||||
* Date: 3/7/2008
|
||||
* http://flesler.blogspot.com/2007/10/jquerylisten.html
|
||||
* @version 1.0.3
|
||||
*/
|
||||
;(function($){var a='indexer',h=$.event,j=h.special,k=$.listen=function(c,d,e,f){if(typeof d!='object'){f=e;e=d;d=document}o(c.split(/\s+/),function(a){a=k.fixes[a]||a;var b=m(d,a)||m(d,a,new n(a,d));b.append(e,f);b.start()})},m=function(b,c,d){return $.data(b,c+'.'+a,d)};$.fn[a]=function(a){return this[0]&&m(this[0],a)||null};$[a]=function(a){return m(document,a)};$.extend(k,{regex:/^((?:\w*?|\*))(?:([#.])([\w-]+))?$/,fixes:{focus:'focusin',blur:'focusout'},cache:function(a){this.caching=a}});$.each(k.fixes,function(a,b){j[b]={setup:function(){if($.browser.msie)return!1;this.addEventListener(a,j[b].handler,!0)},teardown:function(){if($.browser.msie)return!1;this.removeEventListener(a,j[b].handler,!0)},handler:function(e){arguments[0]=e=h.fix(e);e.type=b;return h.handle.apply(this,arguments)}}});$.fn.listen=function(a,b,c){return this.each(function(){k(a,this,b,c)})};function n(a,b){$.extend(this,{ids:{},tags:{},listener:b,event:a});this.id=n.instances.push(this)};n.instances=[];n.prototype={constructor:n,handle:function(e){var a=e.stopPropagation;e.stopPropagation=function(){e.stopped=1;a.apply(this,arguments)};m(this,e.type).parse(e);e.stopPropagation=a;a=e.data=null},on:0,bubbles:0,start:function(){var a=this;if(!a.on){h.add(a.listener,a.event,a.handle);a.on=1}},stop:function(){var a=this;if(a.on){h.remove(a.listener,a.event,a.handle);a.on=0}},cache:function(a,b){return $.data(a,'listenCache_'+this.id,b)},parse:function(e){var z=this,c=e.data||e.target,d=arguments,f;if(!k.caching||!(f=z.cache(c))){f=[];if(c.id&&z.ids[c.id])p(f,z.ids[c.id]);o([c.nodeName,'*'],function(a){var b=z.tags[a];if(b)o((c.className+' *').split(' '),function(a){if(a&&b[a])p(f,b[a])})});if(k.caching)z.cache(c,f)}if(f[0]){o(f,function(a){if(a.apply(c,d)===!1){e.preventDefault();e.stopPropagation()}})}if(!e.stopped&&(c=c.parentNode)&&(c.nodeName=='A'||z.bubbles&&c!=z.listener)){e.data=c;z.parse(e)}f=d=c=null},append:function(f,g){var z=this;o(f.split(/\s*,\s*/),function(a){var b=k.regex.exec(a);if(!b)throw'$.listen > "'+a+'" is not a supported selector.';var c=b[2]=='#'&&b[3],d=b[1].toUpperCase()||'*',e=b[3]||'*';if(c)(z.ids[c]||(z.ids[c]=[])).push(g);else if(d){d=z.tags[d]=z.tags[d]||{};(d[e]||(d[e]=[])).push(g)}})}};function o(a,b,c){for(var i=0,l=a.length;i<l;i++)b.call(c,a[i],i)};function p(a,b){a.push.apply(a,b);return a};$(window).unload(function(){if(typeof n=='function')o(n.instances,function(b){b.stop();$.removeData(b.listener,b.event+'.'+a);b.ids=b.names=b.listener=null})})})(jQuery);
|
||||
19
static/cms/js/jstree/_lib/jquery.log.js
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
(function($){ // block scope
|
||||
jQuery.fn.log = function (msg) {
|
||||
if (!window.console || !console) return;
|
||||
if (window.console || console.firebug){
|
||||
msg = msg || '';
|
||||
if(msg !== '') msg += ': ';
|
||||
console.log("%s%o", msg, this);
|
||||
}
|
||||
return this;
|
||||
};
|
||||
$.extend({
|
||||
log : function (msg) {
|
||||
if (!window.console || !console) return;
|
||||
if (window.console || console.firebug) {
|
||||
console.log("%s", msg);
|
||||
}
|
||||
}
|
||||
});
|
||||
})(jQuery);
|
||||
122
static/cms/js/jstree/_lib/jquery.metadata.js
Normal file
|
|
@ -0,0 +1,122 @@
|
|||
/*
|
||||
* Metadata - jQuery plugin for parsing metadata from elements
|
||||
*
|
||||
* Copyright (c) 2006 John Resig, Yehuda Katz, J<EFBFBD>örn Zaefferer, Paul McLanahan
|
||||
*
|
||||
* Dual licensed under the MIT and GPL licenses:
|
||||
* http://www.opensource.org/licenses/mit-license.php
|
||||
* http://www.gnu.org/licenses/gpl.html
|
||||
*
|
||||
* Revision: $Id: jquery.metadata.js 4187 2007-12-16 17:15:27Z joern.zaefferer $
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* Sets the type of metadata to use. Metadata is encoded in JSON, and each property
|
||||
* in the JSON will become a property of the element itself.
|
||||
*
|
||||
* There are three supported types of metadata storage:
|
||||
*
|
||||
* attr: Inside an attribute. The name parameter indicates *which* attribute.
|
||||
*
|
||||
* class: Inside the class attribute, wrapped in curly braces: { }
|
||||
*
|
||||
* elem: Inside a child element (e.g. a script tag). The
|
||||
* name parameter indicates *which* element.
|
||||
*
|
||||
* The metadata for an element is loaded the first time the element is accessed via jQuery.
|
||||
*
|
||||
* As a result, you can define the metadata type, use $(expr) to load the metadata into the elements
|
||||
* matched by expr, then redefine the metadata type and run another $(expr) for other elements.
|
||||
*
|
||||
* @name $.metadata.setType
|
||||
*
|
||||
* @example <p id="one" class="some_class {item_id: 1, item_label: 'Label'}">This is a p</p>
|
||||
* @before $.metadata.setType("class")
|
||||
* @after $("#one").metadata().item_id == 1; $("#one").metadata().item_label == "Label"
|
||||
* @desc Reads metadata from the class attribute
|
||||
*
|
||||
* @example <p id="one" class="some_class" data="{item_id: 1, item_label: 'Label'}">This is a p</p>
|
||||
* @before $.metadata.setType("attr", "data")
|
||||
* @after $("#one").metadata().item_id == 1; $("#one").metadata().item_label == "Label"
|
||||
* @desc Reads metadata from a "data" attribute
|
||||
*
|
||||
* @example <p id="one" class="some_class"><script>{item_id: 1, item_label: 'Label'}</script>This is a p</p>
|
||||
* @before $.metadata.setType("elem", "script")
|
||||
* @after $("#one").metadata().item_id == 1; $("#one").metadata().item_label == "Label"
|
||||
* @desc Reads metadata from a nested script element
|
||||
*
|
||||
* @param String type The encoding type
|
||||
* @param String name The name of the attribute to be used to get metadata (optional)
|
||||
* @cat Plugins/Metadata
|
||||
* @descr Sets the type of encoding to be used when loading metadata for the first time
|
||||
* @type undefined
|
||||
* @see metadata()
|
||||
*/
|
||||
|
||||
(function($) {
|
||||
|
||||
$.extend({
|
||||
metadata : {
|
||||
defaults : {
|
||||
type: 'class',
|
||||
name: 'metadata',
|
||||
cre: /({.*})/,
|
||||
single: 'metadata'
|
||||
},
|
||||
setType: function( type, name ){
|
||||
this.defaults.type = type;
|
||||
this.defaults.name = name;
|
||||
},
|
||||
get: function( elem, opts ){
|
||||
var settings = $.extend({},this.defaults,opts);
|
||||
// check for empty string in single property
|
||||
if ( !settings.single.length ) settings.single = 'metadata';
|
||||
|
||||
var data = $.data(elem, settings.single);
|
||||
// returned cached data if it already exists
|
||||
if ( data ) return data;
|
||||
|
||||
data = "{}";
|
||||
|
||||
if ( settings.type == "class" ) {
|
||||
var m = settings.cre.exec( elem.className );
|
||||
if ( m )
|
||||
data = m[1];
|
||||
} else if ( settings.type == "elem" ) {
|
||||
if( !elem.getElementsByTagName )
|
||||
return undefined;
|
||||
var e = elem.getElementsByTagName(settings.name);
|
||||
if ( e.length )
|
||||
data = $.trim(e[0].innerHTML);
|
||||
} else if ( elem.getAttribute != undefined ) {
|
||||
var attr = elem.getAttribute( settings.name );
|
||||
if ( attr )
|
||||
data = attr;
|
||||
}
|
||||
|
||||
if ( data.indexOf( '{' ) <0 )
|
||||
data = "{" + data + "}";
|
||||
|
||||
data = eval("(" + data + ")");
|
||||
|
||||
$.data( elem, settings.single, data );
|
||||
return data;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* Returns the metadata object for the first member of the jQuery object.
|
||||
*
|
||||
* @name metadata
|
||||
* @descr Returns element's metadata object
|
||||
* @param Object opts An object contianing settings to override the defaults
|
||||
* @type jQuery
|
||||
* @cat Plugins/Metadata
|
||||
*/
|
||||
$.fn.metadata = function( opts ){
|
||||
return $.metadata.get( this[0], opts );
|
||||
};
|
||||
|
||||
})(jQuery);
|
||||
352
static/cms/js/jstree/_lib/jquery.xslt.js
Normal file
|
|
@ -0,0 +1,352 @@
|
|||
/**
|
||||
* xslTransform
|
||||
* Tools for XSLT transformations; jQuery wrapper for Sarissa <http://sarissa.sourceforge.net/>.
|
||||
* See jQuery.fn.log below for documentation on $.log().
|
||||
* See jQuery.fn.getTransform below for documention on the $.getTransform().
|
||||
* See var DEBUG below for turning debugging/logging on and off.
|
||||
*
|
||||
* @version 20071203
|
||||
* @since 2006-07-05
|
||||
* @copyright Copyright (c) 2006 Glyphix Studio, Inc. http://www.glyphix.com
|
||||
* @author Brad Brizendine <brizbane@gmail.com>, Matt Antone <antone@glyphix.com>
|
||||
* @license MIT http://www.opensource.org/licenses/mit-license.php
|
||||
* @requires >= jQuery 1.0.3 http://jquery.com/
|
||||
* @requires jquery.debug.js http://jquery.glyphix.com/
|
||||
* @requires >= sarissa.js 0.9.7.6 http://sarissa.sourceforge.net/
|
||||
*
|
||||
* @example
|
||||
* var r = xslTransform.transform('path-to-xsl.xsl','path-to-xml.xml');
|
||||
* @desc Perform a transformation and place the results in var r
|
||||
*
|
||||
* @example
|
||||
* var r = xslTransform.transform('path-to-xsl.xsl','path-to-xml.xml');
|
||||
* var str = xslTransform.serialize( r );
|
||||
* @desc Perform a transformation, then turn the result into a string
|
||||
*
|
||||
* @example
|
||||
* var doc = xslTransform.load('path-to-xml.xml');
|
||||
* @desc Load an xml file and return a parsed xml object
|
||||
*
|
||||
* @example
|
||||
* var xml = '<xmldoc><foo>bar</foo></xmldoc>';
|
||||
* var doc = xslTransform.load(xml);
|
||||
* @desc Load an xml string and return a parsed xml object
|
||||
*/
|
||||
var xslTransform = {
|
||||
|
||||
version: 20071203,
|
||||
debug: false,
|
||||
|
||||
// init ... test for requirements
|
||||
init: function(){
|
||||
// check for v1.0.4 / v1.1 or later of jQuery
|
||||
try{
|
||||
parseFloat(jQuery.fn.jquery) >= 1;
|
||||
}catch(e){
|
||||
alert('xslTransform requires jQuery 1.0.4 or greater ... please load it prior to xslTransform');
|
||||
}
|
||||
// check for Sarissa
|
||||
try{
|
||||
Sarissa;
|
||||
}catch(e){
|
||||
alert('Missing Sarissa ... please load it prior to xslTransform');
|
||||
}
|
||||
// if no log function, create a blank one
|
||||
if( !jQuery.log ){
|
||||
jQuery.log = function(){};
|
||||
jQuery.fn.debug = function(){};
|
||||
}
|
||||
// log the version
|
||||
if(this.debug) jQuery.log( 'xslTransform:init(): version ' + xslTransform.version );
|
||||
},
|
||||
|
||||
// initialize Sarissa's serializer
|
||||
XMLSerializer: new XMLSerializer(),
|
||||
|
||||
/*
|
||||
* serialize
|
||||
* Turns the provided object into a string and returns it.
|
||||
*
|
||||
* @param data Mixed
|
||||
* @returns String
|
||||
*/
|
||||
serialize: function( data ){
|
||||
if(this.debug) jQuery.log( 'serialize(): received ' + typeof(data) );
|
||||
// if it's already a string, no further processing required
|
||||
if( typeof(data) == 'string' ){
|
||||
return data;
|
||||
}
|
||||
|
||||
return this.XMLSerializer.serializeToString( data );
|
||||
},
|
||||
|
||||
/*
|
||||
* load
|
||||
* Attempts to load xml data by automatically sensing the type of the provided data.
|
||||
*
|
||||
* @param xml Mixed the xml data
|
||||
* @returns Object
|
||||
*/
|
||||
load: function( xml, meth ){
|
||||
if(this.debug) jQuery.log( 'load(): received ' + typeof(xml) );
|
||||
// the result
|
||||
var r;
|
||||
|
||||
// if it's an object, assume it's already an XML object, so just return it
|
||||
if( typeof(xml) == 'object' ){
|
||||
return xml;
|
||||
}
|
||||
|
||||
// if it's a string, determine if it's xml data or a path
|
||||
// assume that the first character is an opening caret if it's XML data
|
||||
if( xml.substring(0,1) == '<' ){
|
||||
r = this.loadString( xml );
|
||||
}else{
|
||||
r = this.loadFile( xml , meth );
|
||||
}
|
||||
|
||||
if( r ){
|
||||
// the following two lines are needed to get IE (msxml3) to run xpath ... set it on all xml data
|
||||
r.setProperty( 'SelectionNamespaces', 'xmlns:xsl="http://www.w3.org/1999/XSL/Transform"' );
|
||||
r.setProperty( 'SelectionLanguage', 'XPath' );
|
||||
return r;
|
||||
}else{
|
||||
if(this.debug) $.log( 'Unable to load ' + xml );
|
||||
return false;
|
||||
}
|
||||
},
|
||||
|
||||
/*
|
||||
* loadString
|
||||
* Parses an XML string and returns the result.
|
||||
*
|
||||
* @param str String the xml string to turn into a parsed XML object
|
||||
* @returns Object
|
||||
*/
|
||||
loadString: function( str ){
|
||||
if(this.debug) jQuery.log( 'loadString(): ' + str + '::' + typeof(str) );
|
||||
|
||||
// use Sarissa to generate an XML doc
|
||||
var p = new DOMParser();
|
||||
var xml = p.parseFromString( str, 'text/xml' );
|
||||
if( !xml ){
|
||||
if(this.debug) jQuery.log( 'loadString(): parseFromString() failed' );
|
||||
return false;
|
||||
}
|
||||
return xml;
|
||||
},
|
||||
|
||||
/*
|
||||
* loadFile
|
||||
* Attempts to retrieve the requested path, specified by url.
|
||||
* If url is an object, it's assumed it's already loaded, and just returns it.
|
||||
*
|
||||
* @param url Mixed
|
||||
* @returns Object
|
||||
*/
|
||||
loadFile: function( url, meth ){
|
||||
if(this.debug) jQuery.log( 'loadFile(): ' + url + '::' + typeof(url) );
|
||||
|
||||
if( !url ){
|
||||
if(this.debug) jQuery.log( 'ERROR: loadFile() missing url' );
|
||||
return false;
|
||||
}
|
||||
|
||||
// variable to hold ajax results
|
||||
var doc;
|
||||
// function to receive data on successful download ... semicolon after brace is necessary for packing
|
||||
this.xhrsuccess = function(data,str){
|
||||
if(this.debug) jQuery.log( 'loadFile() completed successfully (' + str + ')' );
|
||||
doc = data;
|
||||
return true;
|
||||
};
|
||||
// function to handle downloading error ... semicolon after brace is necessary for packing
|
||||
this.xhrerror = function(xhr,err){
|
||||
// set debugging to true in order to force the display of this error
|
||||
window.DEBUG = true;
|
||||
if(this.debug) jQuery.log( 'loadFile() failed to load the requested file: (' + err + ') - xml: ' + xhr.responseXML + ' - text: ' + xhr.responseText );
|
||||
doc = null;
|
||||
return false;
|
||||
};
|
||||
|
||||
// make asynchronous ajax call and call functions defined above on success/error
|
||||
if(!meth) meth = "GET";
|
||||
$.ajax({
|
||||
type: meth,
|
||||
url: url,
|
||||
async: false,
|
||||
success: this.xhrsuccess,
|
||||
error: this.xhrerror
|
||||
});
|
||||
|
||||
// check for total failure
|
||||
if( !doc ){
|
||||
if(this.debug) jQuery.log( 'ERROR: document ' + url + ' not found (404), or unable to load' );
|
||||
return false;
|
||||
}
|
||||
// check for success but no data
|
||||
if( doc.length == 0 ){
|
||||
if(this.debug) jQuery.log( 'ERROR: document ' + url + ' loaded in loadFile() has no data' );
|
||||
return false;
|
||||
}
|
||||
return doc;
|
||||
},
|
||||
|
||||
/*
|
||||
* transform
|
||||
* Central transformation function: takes an xml doc and an xsl doc.
|
||||
*
|
||||
* @param xsl Mixed the xsl transformation document
|
||||
* @param xml Mixed the xml document to be transformed
|
||||
* @param options Object various switches you can send to this function
|
||||
* + params: an object of key/value pairs to be sent to xsl as parameters
|
||||
* + xpath: defines the root node within the provided xml file
|
||||
* @returns Object the results of the transformation
|
||||
* + xsl: the raw xsl doc
|
||||
* + doc: the raw results of the transform
|
||||
* + string: the serialized doc
|
||||
*/
|
||||
transform: function( xsl, xml, options ){
|
||||
var log = { 'xsl':xsl, 'xml':xml, 'options':options };
|
||||
if(this.debug) jQuery.log( 'transform(): ' + xsl + '::' + xml + '::' + options.toString() );
|
||||
|
||||
// initialize options hash
|
||||
options = options || {};
|
||||
|
||||
// initialize the xml object and store it in xml.doc
|
||||
var xml = { 'request':xml, 'doc':this.load(xml, options.meth) };
|
||||
// if we have an xpath, replace xml.doc with the results of running it
|
||||
// as of 2007-12-03, IE throws a "msxml6: the parameter is incorrect" error, so removing this
|
||||
if( options.xpath && xml.doc && !jQuery.browser.msie ){
|
||||
// run the xpath
|
||||
xml.doc = xml.doc.selectSingleNode( options.xpath.toString() );
|
||||
if(this.debug) $.log( 'transform(): xpath has been run...resulting doc: ' + (this.serialize(xml.doc)) );
|
||||
}
|
||||
|
||||
// initialize the result object ... store the primary steps of the transform in result
|
||||
var result = { 'xsl':this.load(xsl, options.meth) };
|
||||
|
||||
result.json = false;
|
||||
if( options.json && xml.doc ) {
|
||||
result.json = xml.doc.selectSingleNode( options.json.toString() );
|
||||
}
|
||||
|
||||
var processor = new XSLTProcessor();
|
||||
// stylesheet must be imported before parameters can be added
|
||||
processor.importStylesheet( result.xsl );
|
||||
// add parameters to the processor
|
||||
if( options.params && processor ){
|
||||
if(this.debug) jQuery.log( 'transform(): received xsl params: ' + options.params.toString() );
|
||||
for( key in options.params ){
|
||||
// name and value must be strings
|
||||
// first parameter is namespace
|
||||
processor.setParameter( null, key.toString(), options.params[key].toString() );
|
||||
}
|
||||
}
|
||||
|
||||
// perform the transformation
|
||||
result.doc = processor.transformToDocument( xml.doc );
|
||||
// handle transform error
|
||||
var errorTxt = Sarissa.getParseErrorText(result.doc);
|
||||
if(this.debug) jQuery.log( 'transform(): Sarissa parse text: ' + errorTxt );
|
||||
if( errorTxt != Sarissa.PARSED_OK ){
|
||||
// return the error text as the string
|
||||
result.string = Sarissa.getParseErrorText(result.doc) + ' :: using ' + xsl + ' => ' + xml.request;
|
||||
if(this.debug) jQuery.log( 'transform(): error in transformation: ' + Sarissa.getParseErrorText(result.doc) );
|
||||
return result;
|
||||
}
|
||||
|
||||
// if we made it this far, the transformation was successful
|
||||
result.string = this.serialize( result.doc );
|
||||
// store reference to all scripts found in the doc (not result.string)
|
||||
result.scripts = jQuery('script',result.doc).text();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
// create the xslTransform object
|
||||
// this creates a single object for the page, allowing re-use of the XSL processor
|
||||
xslTransform.init();
|
||||
|
||||
/*
|
||||
* JQuery XSLT transformation plugin.
|
||||
* Replaces all matched elements with the results of an XSLT transformation.
|
||||
* See xslTransform above for more documentation.
|
||||
*
|
||||
* @example
|
||||
* @desc See the xslTransform-example/index.html
|
||||
*
|
||||
* @param xsl String the url to the xsl file
|
||||
* @param xml String the url to the xml file
|
||||
* @param options Object various switches you can send to this function
|
||||
* + params: an object of key/value pairs to be sent to xsl as parameters
|
||||
* + xpath: defines the root node within the provided xml file
|
||||
* + eval: if true, will attempt to eval javascript found in the transformed result
|
||||
* + callback: if a Function, evaluate it when transformation is complete
|
||||
* @returns
|
||||
*/
|
||||
jQuery.fn.getTransform = function( xsl, xml, options ){
|
||||
var settings = {
|
||||
append: false,
|
||||
params: {}, // object of key/value pairs ... parameters to send to the XSL stylesheet
|
||||
xpath: '', // xpath, used to send only a portion of the XML file to the XSL stylesheet
|
||||
eval: true, // evaluate <script> blocks found in the transformed result
|
||||
callback: '', // callback function, to be run on completion of the transformation
|
||||
json: false,
|
||||
meth : "GET"
|
||||
};
|
||||
// initialize options hash; override the defaults with supplied options
|
||||
jQuery.extend( settings, options );
|
||||
if(xslTransform.debug) jQuery.log( 'getTransform: ' + xsl + '::' + xml + '::' + settings.toString() );
|
||||
|
||||
// must have both xsl and xml
|
||||
if( !xsl || !xml ){
|
||||
if(xslTransform.debug) jQuery.log( 'getTransform: missing xsl or xml' );
|
||||
return;
|
||||
}
|
||||
|
||||
// run the jquery magic on all matched elements
|
||||
return this.each( function(){
|
||||
// perform the transformation
|
||||
var trans = xslTransform.transform( xsl, xml, settings );
|
||||
|
||||
// ie can fail if there's an xml declaration line in the returned result
|
||||
var re = trans.string.match(/<\?xml.*?\?>/);
|
||||
if( re ){
|
||||
trans.string = trans.string.replace( re, '' );
|
||||
if(xslTransform.debug) jQuery.log( 'getTransform(): found an xml declaration and removed it' );
|
||||
}
|
||||
|
||||
// place the result in the element
|
||||
// 20070202: jquery 1.1.1 can get a "a.appendChild is not a function" error using html() sometimes ...
|
||||
// no idea why yet, so adding a fallback to innerHTML
|
||||
// ::warning:: ie6 has trouble with javascript events such as onclick assigned statically within the html when using innerHTML
|
||||
try {
|
||||
if(settings.append) $(this).append( trans.string );
|
||||
else if(settings.repl) $(this).replaceWith( trans.string );
|
||||
else $(this).html( trans.string );
|
||||
} catch(e) {
|
||||
if(xslTransform.debug) $.log( 'getTransform: error placing results of transform into element, falling back to innerHTML: ' + e.toString() );
|
||||
$(this)[0].innerHTML = trans.string;
|
||||
}
|
||||
|
||||
// there might not be a scripts property
|
||||
if( settings.eval && trans.scripts ){
|
||||
if( trans.scripts.length > 0 ){
|
||||
if(xslTransform.debug) jQuery.log( 'Found text/javascript in transformed result' );
|
||||
eval.call( window, trans.scripts );
|
||||
}
|
||||
}
|
||||
|
||||
// run the callback if it's a native function
|
||||
if( settings.callback && jQuery.isFunction(settings.callback) ){
|
||||
var json = false;
|
||||
if(settings.json && trans.json) eval("json = " + trans.json.firstChild.data);
|
||||
settings.callback.apply(window, [trans.string, json]);
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
};
|
||||
110
static/cms/js/jstree/_lib/sarissa.js
Normal file
|
|
@ -0,0 +1,110 @@
|
|||
|
||||
/* * ====================================================================
|
||||
* About: This a a compressed JS file from the Sarissa library.
|
||||
* see http://dev.abiss.gr/sarissa
|
||||
*
|
||||
* Copyright: Manos Batsis, http://dev.abiss.gr
|
||||
*
|
||||
* Licence:
|
||||
* Sarissa is free software distributed under the GNU GPL version 2
|
||||
* or higher, GNU LGPL version 2.1 or higher and Apache Software
|
||||
* License 2.0 or higher. The licenses are available online see:
|
||||
* http://www.gnu.org
|
||||
* http://www.apache.org
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
* KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
* WARRANTIES OF MERCHANTABILITY,FITNESS FOR A PARTICULAR PURPOSE
|
||||
* AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
* ====================================================================*/
|
||||
|
||||
function Sarissa(){}
|
||||
Sarissa.VERSION="0.9.9.4";Sarissa.PARSED_OK="Document contains no parsing errors";Sarissa.PARSED_EMPTY="Document is empty";Sarissa.PARSED_UNKNOWN_ERROR="Not well-formed or other error";Sarissa.IS_ENABLED_TRANSFORM_NODE=false;Sarissa.REMOTE_CALL_FLAG="gr.abiss.sarissa.REMOTE_CALL_FLAG";Sarissa._lastUniqueSuffix=0;Sarissa._getUniqueSuffix=function(){return Sarissa._lastUniqueSuffix++;};Sarissa._SARISSA_IEPREFIX4XSLPARAM="";Sarissa._SARISSA_HAS_DOM_IMPLEMENTATION=document.implementation&&true;Sarissa._SARISSA_HAS_DOM_CREATE_DOCUMENT=Sarissa._SARISSA_HAS_DOM_IMPLEMENTATION&&document.implementation.createDocument;Sarissa._SARISSA_HAS_DOM_FEATURE=Sarissa._SARISSA_HAS_DOM_IMPLEMENTATION&&document.implementation.hasFeature;Sarissa._SARISSA_IS_MOZ=Sarissa._SARISSA_HAS_DOM_CREATE_DOCUMENT&&Sarissa._SARISSA_HAS_DOM_FEATURE;Sarissa._SARISSA_IS_SAFARI=navigator.userAgent.toLowerCase().indexOf("safari")!=-1||navigator.userAgent.toLowerCase().indexOf("konqueror")!=-1;Sarissa._SARISSA_IS_SAFARI_OLD=Sarissa._SARISSA_IS_SAFARI&&(parseInt((navigator.userAgent.match(/AppleWebKit\/(\d+)/)||{})[1],10)<420);Sarissa._SARISSA_IS_IE=document.all&&window.ActiveXObject&&navigator.userAgent.toLowerCase().indexOf("msie")>-1&&navigator.userAgent.toLowerCase().indexOf("opera")==-1;Sarissa._SARISSA_IS_OPERA=navigator.userAgent.toLowerCase().indexOf("opera")!=-1;if(!window.Node||!Node.ELEMENT_NODE){Node={ELEMENT_NODE:1,ATTRIBUTE_NODE:2,TEXT_NODE:3,CDATA_SECTION_NODE:4,ENTITY_REFERENCE_NODE:5,ENTITY_NODE:6,PROCESSING_INSTRUCTION_NODE:7,COMMENT_NODE:8,DOCUMENT_NODE:9,DOCUMENT_TYPE_NODE:10,DOCUMENT_FRAGMENT_NODE:11,NOTATION_NODE:12};}
|
||||
if(Sarissa._SARISSA_IS_SAFARI_OLD){HTMLHtmlElement=document.createElement("html").constructor;Node=HTMLElement={};HTMLElement.prototype=HTMLHtmlElement.__proto__.__proto__;HTMLDocument=Document=document.constructor;var x=new DOMParser();XMLDocument=x.constructor;Element=x.parseFromString("<Single />","text/xml").documentElement.constructor;x=null;}
|
||||
if(typeof XMLDocument=="undefined"&&typeof Document!="undefined"){XMLDocument=Document;}
|
||||
if(Sarissa._SARISSA_IS_IE){Sarissa._SARISSA_IEPREFIX4XSLPARAM="xsl:";var _SARISSA_DOM_PROGID="";var _SARISSA_XMLHTTP_PROGID="";var _SARISSA_DOM_XMLWRITER="";Sarissa.pickRecentProgID=function(idList){var bFound=false,e;var o2Store;for(var i=0;i<idList.length&&!bFound;i++){try{var oDoc=new ActiveXObject(idList[i]);o2Store=idList[i];bFound=true;}catch(objException){e=objException;}}
|
||||
if(!bFound){throw"Could not retrieve a valid progID of Class: "+idList[idList.length-1]+". (original exception: "+e+")";}
|
||||
idList=null;return o2Store;};_SARISSA_DOM_PROGID=null;_SARISSA_THREADEDDOM_PROGID=null;_SARISSA_XSLTEMPLATE_PROGID=null;_SARISSA_XMLHTTP_PROGID=null;XMLHttpRequest=function(){if(!_SARISSA_XMLHTTP_PROGID){_SARISSA_XMLHTTP_PROGID=Sarissa.pickRecentProgID(["Msxml2.XMLHTTP.6.0","MSXML2.XMLHTTP.3.0","MSXML2.XMLHTTP","Microsoft.XMLHTTP"]);}
|
||||
return new ActiveXObject(_SARISSA_XMLHTTP_PROGID);};Sarissa.getDomDocument=function(sUri,sName){if(!_SARISSA_DOM_PROGID){_SARISSA_DOM_PROGID=Sarissa.pickRecentProgID(["Msxml2.DOMDocument.6.0","Msxml2.DOMDocument.3.0","MSXML2.DOMDocument","MSXML.DOMDocument","Microsoft.XMLDOM"]);}
|
||||
var oDoc=new ActiveXObject(_SARISSA_DOM_PROGID);if(sName){var prefix="";if(sUri){if(sName.indexOf(":")>1){prefix=sName.substring(0,sName.indexOf(":"));sName=sName.substring(sName.indexOf(":")+1);}else{prefix="a"+Sarissa._getUniqueSuffix();}}
|
||||
if(sUri){oDoc.loadXML('<'+prefix+':'+sName+" xmlns:"+prefix+"=\""+sUri+"\""+" />");}else{oDoc.loadXML('<'+sName+" />");}}
|
||||
return oDoc;};Sarissa.getParseErrorText=function(oDoc){var parseErrorText=Sarissa.PARSED_OK;if(oDoc&&oDoc.parseError&&oDoc.parseError.errorCode&&oDoc.parseError.errorCode!=0){parseErrorText="XML Parsing Error: "+oDoc.parseError.reason+"\nLocation: "+oDoc.parseError.url+"\nLine Number "+oDoc.parseError.line+", Column "+
|
||||
oDoc.parseError.linepos+":\n"+oDoc.parseError.srcText+"\n";for(var i=0;i<oDoc.parseError.linepos;i++){parseErrorText+="-";}
|
||||
parseErrorText+="^\n";}
|
||||
else if(oDoc.documentElement===null){parseErrorText=Sarissa.PARSED_EMPTY;}
|
||||
return parseErrorText;};Sarissa.setXpathNamespaces=function(oDoc,sNsSet){oDoc.setProperty("SelectionLanguage","XPath");oDoc.setProperty("SelectionNamespaces",sNsSet);};XSLTProcessor=function(){if(!_SARISSA_XSLTEMPLATE_PROGID){_SARISSA_XSLTEMPLATE_PROGID=Sarissa.pickRecentProgID(["Msxml2.XSLTemplate.6.0","MSXML2.XSLTemplate.3.0"]);}
|
||||
this.template=new ActiveXObject(_SARISSA_XSLTEMPLATE_PROGID);this.processor=null;};XSLTProcessor.prototype.importStylesheet=function(xslDoc){if(!_SARISSA_THREADEDDOM_PROGID){_SARISSA_THREADEDDOM_PROGID=Sarissa.pickRecentProgID(["MSXML2.FreeThreadedDOMDocument.6.0","MSXML2.FreeThreadedDOMDocument.3.0"]);}
|
||||
xslDoc.setProperty("SelectionLanguage","XPath");xslDoc.setProperty("SelectionNamespaces","xmlns:xsl='http://www.w3.org/1999/XSL/Transform'");var converted=new ActiveXObject(_SARISSA_THREADEDDOM_PROGID);try{converted.resolveExternals=true;converted.setProperty("AllowDocumentFunction",true);}
|
||||
catch(e){}
|
||||
if(xslDoc.url&&xslDoc.selectSingleNode("//xsl:*[local-name() = 'import' or local-name() = 'include']")!=null){converted.async=false;converted.load(xslDoc.url);}
|
||||
else{converted.loadXML(xslDoc.xml);}
|
||||
converted.setProperty("SelectionNamespaces","xmlns:xsl='http://www.w3.org/1999/XSL/Transform'");var output=converted.selectSingleNode("//xsl:output");if(output){this.outputMethod=output.getAttribute("method");}
|
||||
else{delete this.outputMethod;}
|
||||
this.template.stylesheet=converted;this.processor=this.template.createProcessor();this.paramsSet=[];};XSLTProcessor.prototype.transformToDocument=function(sourceDoc){var outDoc;if(_SARISSA_THREADEDDOM_PROGID){this.processor.input=sourceDoc;outDoc=new ActiveXObject(_SARISSA_DOM_PROGID);this.processor.output=outDoc;this.processor.transform();return outDoc;}
|
||||
else{if(!_SARISSA_DOM_XMLWRITER){_SARISSA_DOM_XMLWRITER=Sarissa.pickRecentProgID(["Msxml2.MXXMLWriter.6.0","Msxml2.MXXMLWriter.3.0","MSXML2.MXXMLWriter","MSXML.MXXMLWriter","Microsoft.XMLDOM"]);}
|
||||
this.processor.input=sourceDoc;outDoc=new ActiveXObject(_SARISSA_DOM_XMLWRITER);this.processor.output=outDoc;this.processor.transform();var oDoc=new ActiveXObject(_SARISSA_DOM_PROGID);oDoc.loadXML(outDoc.output+"");return oDoc;}};XSLTProcessor.prototype.transformToFragment=function(sourceDoc,ownerDoc){this.processor.input=sourceDoc;this.processor.transform();var s=this.processor.output;var f=ownerDoc.createDocumentFragment();var container;if(this.outputMethod=='text'){f.appendChild(ownerDoc.createTextNode(s));}else if(ownerDoc.body&&ownerDoc.body.innerHTML){container=ownerDoc.createElement('div');container.innerHTML=s;while(container.hasChildNodes()){f.appendChild(container.firstChild);}}
|
||||
else{var oDoc=new ActiveXObject(_SARISSA_DOM_PROGID);if(s.substring(0,5)=='<?xml'){s=s.substring(s.indexOf('?>')+2);}
|
||||
var xml=''.concat('<my>',s,'</my>');oDoc.loadXML(xml);container=oDoc.documentElement;while(container.hasChildNodes()){f.appendChild(container.firstChild);}}
|
||||
return f;};XSLTProcessor.prototype.setParameter=function(nsURI,name,value){value=value?value:"";if(nsURI){this.processor.addParameter(name,value,nsURI);}else{this.processor.addParameter(name,value);}
|
||||
nsURI=""+(nsURI||"");if(!this.paramsSet[nsURI]){this.paramsSet[nsURI]=[];}
|
||||
this.paramsSet[nsURI][name]=value;};XSLTProcessor.prototype.getParameter=function(nsURI,name){nsURI=""+(nsURI||"");if(this.paramsSet[nsURI]&&this.paramsSet[nsURI][name]){return this.paramsSet[nsURI][name];}else{return null;}};XSLTProcessor.prototype.clearParameters=function(){for(var nsURI in this.paramsSet){for(var name in this.paramsSet[nsURI]){if(nsURI!=""){this.processor.addParameter(name,"",nsURI);}else{this.processor.addParameter(name,"");}}}
|
||||
this.paramsSet=[];};}else{if(Sarissa._SARISSA_HAS_DOM_CREATE_DOCUMENT){Sarissa.__handleLoad__=function(oDoc){Sarissa.__setReadyState__(oDoc,4);};_sarissa_XMLDocument_onload=function(){Sarissa.__handleLoad__(this);};Sarissa.__setReadyState__=function(oDoc,iReadyState){oDoc.readyState=iReadyState;oDoc.readystate=iReadyState;if(oDoc.onreadystatechange!=null&&typeof oDoc.onreadystatechange=="function"){oDoc.onreadystatechange();}};Sarissa.getDomDocument=function(sUri,sName){var oDoc=document.implementation.createDocument(sUri?sUri:null,sName?sName:null,null);if(!oDoc.onreadystatechange){oDoc.onreadystatechange=null;}
|
||||
if(!oDoc.readyState){oDoc.readyState=0;}
|
||||
oDoc.addEventListener("load",_sarissa_XMLDocument_onload,false);return oDoc;};if(window.XMLDocument){}
|
||||
else if(Sarissa._SARISSA_HAS_DOM_FEATURE&&window.Document&&!Document.prototype.load&&document.implementation.hasFeature('LS','3.0')){Sarissa.getDomDocument=function(sUri,sName){var oDoc=document.implementation.createDocument(sUri?sUri:null,sName?sName:null,null);return oDoc;};}
|
||||
else{Sarissa.getDomDocument=function(sUri,sName){var oDoc=document.implementation.createDocument(sUri?sUri:null,sName?sName:null,null);if(oDoc&&(sUri||sName)&&!oDoc.documentElement){oDoc.appendChild(oDoc.createElementNS(sUri,sName));}
|
||||
return oDoc;};}}}
|
||||
if(!window.DOMParser){if(Sarissa._SARISSA_IS_SAFARI){DOMParser=function(){};DOMParser.prototype.parseFromString=function(sXml,contentType){var xmlhttp=new XMLHttpRequest();xmlhttp.open("GET","data:text/xml;charset=utf-8,"+encodeURIComponent(sXml),false);xmlhttp.send(null);return xmlhttp.responseXML;};}else if(Sarissa.getDomDocument&&Sarissa.getDomDocument()&&Sarissa.getDomDocument(null,"bar").xml){DOMParser=function(){};DOMParser.prototype.parseFromString=function(sXml,contentType){var doc=Sarissa.getDomDocument();doc.loadXML(sXml);return doc;};}}
|
||||
if((typeof(document.importNode)=="undefined")&&Sarissa._SARISSA_IS_IE){try{document.importNode=function(oNode,bChildren){var tmp;if(oNode.nodeName=='#text'){return document.createTextNode(oNode.data);}
|
||||
else{if(oNode.nodeName=="tbody"||oNode.nodeName=="tr"){tmp=document.createElement("table");}
|
||||
else if(oNode.nodeName=="td"){tmp=document.createElement("tr");}
|
||||
else if(oNode.nodeName=="option"){tmp=document.createElement("select");}
|
||||
else{tmp=document.createElement("div");}
|
||||
if(bChildren){tmp.innerHTML=oNode.xml?oNode.xml:oNode.outerHTML;}else{tmp.innerHTML=oNode.xml?oNode.cloneNode(false).xml:oNode.cloneNode(false).outerHTML;}
|
||||
return tmp.getElementsByTagName("*")[0];}};}catch(e){}}
|
||||
if(!Sarissa.getParseErrorText){Sarissa.getParseErrorText=function(oDoc){var parseErrorText=Sarissa.PARSED_OK;if((!oDoc)||(!oDoc.documentElement)){parseErrorText=Sarissa.PARSED_EMPTY;}else if(oDoc.documentElement.tagName=="parsererror"){parseErrorText=oDoc.documentElement.firstChild.data;parseErrorText+="\n"+oDoc.documentElement.firstChild.nextSibling.firstChild.data;}else if(oDoc.getElementsByTagName("parsererror").length>0){var parsererror=oDoc.getElementsByTagName("parsererror")[0];parseErrorText=Sarissa.getText(parsererror,true)+"\n";}else if(oDoc.parseError&&oDoc.parseError.errorCode!=0){parseErrorText=Sarissa.PARSED_UNKNOWN_ERROR;}
|
||||
return parseErrorText;};}
|
||||
Sarissa.getText=function(oNode,deep){var s="";var nodes=oNode.childNodes;for(var i=0;i<nodes.length;i++){var node=nodes[i];var nodeType=node.nodeType;if(nodeType==Node.TEXT_NODE||nodeType==Node.CDATA_SECTION_NODE){s+=node.data;}else if(deep===true&&(nodeType==Node.ELEMENT_NODE||nodeType==Node.DOCUMENT_NODE||nodeType==Node.DOCUMENT_FRAGMENT_NODE)){s+=Sarissa.getText(node,true);}}
|
||||
return s;};if(!window.XMLSerializer&&Sarissa.getDomDocument&&Sarissa.getDomDocument("","foo",null).xml){XMLSerializer=function(){};XMLSerializer.prototype.serializeToString=function(oNode){return oNode.xml;};}
|
||||
Sarissa.stripTags=function(s){return s?s.replace(/<[^>]+>/g,""):s;};Sarissa.clearChildNodes=function(oNode){while(oNode.firstChild){oNode.removeChild(oNode.firstChild);}};Sarissa.copyChildNodes=function(nodeFrom,nodeTo,bPreserveExisting){if(Sarissa._SARISSA_IS_SAFARI&&nodeTo.nodeType==Node.DOCUMENT_NODE){nodeTo=nodeTo.documentElement;}
|
||||
if((!nodeFrom)||(!nodeTo)){throw"Both source and destination nodes must be provided";}
|
||||
if(!bPreserveExisting){Sarissa.clearChildNodes(nodeTo);}
|
||||
var ownerDoc=nodeTo.nodeType==Node.DOCUMENT_NODE?nodeTo:nodeTo.ownerDocument;var nodes=nodeFrom.childNodes;var i;if(typeof(ownerDoc.importNode)!="undefined"){for(i=0;i<nodes.length;i++){nodeTo.appendChild(ownerDoc.importNode(nodes[i],true));}}else{for(i=0;i<nodes.length;i++){nodeTo.appendChild(nodes[i].cloneNode(true));}}};Sarissa.moveChildNodes=function(nodeFrom,nodeTo,bPreserveExisting){if((!nodeFrom)||(!nodeTo)){throw"Both source and destination nodes must be provided";}
|
||||
if(!bPreserveExisting){Sarissa.clearChildNodes(nodeTo);}
|
||||
var nodes=nodeFrom.childNodes;if(nodeFrom.ownerDocument==nodeTo.ownerDocument){while(nodeFrom.firstChild){nodeTo.appendChild(nodeFrom.firstChild);}}else{var ownerDoc=nodeTo.nodeType==Node.DOCUMENT_NODE?nodeTo:nodeTo.ownerDocument;var i;if(typeof(ownerDoc.importNode)!="undefined"){for(i=0;i<nodes.length;i++){nodeTo.appendChild(ownerDoc.importNode(nodes[i],true));}}else{for(i=0;i<nodes.length;i++){nodeTo.appendChild(nodes[i].cloneNode(true));}}
|
||||
Sarissa.clearChildNodes(nodeFrom);}};Sarissa.xmlize=function(anyObject,objectName,indentSpace){indentSpace=indentSpace?indentSpace:'';var s=indentSpace+'<'+objectName+'>';var isLeaf=false;if(!(anyObject instanceof Object)||anyObject instanceof Number||anyObject instanceof String||anyObject instanceof Boolean||anyObject instanceof Date){s+=Sarissa.escape(""+anyObject);isLeaf=true;}else{s+="\n";var isArrayItem=anyObject instanceof Array;for(var name in anyObject){s+=Sarissa.xmlize(anyObject[name],(isArrayItem?"array-item key=\""+name+"\"":name),indentSpace+" ");}
|
||||
s+=indentSpace;}
|
||||
return(s+=(objectName.indexOf(' ')!=-1?"</array-item>\n":"</"+objectName+">\n"));};Sarissa.escape=function(sXml){return sXml.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'");};Sarissa.unescape=function(sXml){return sXml.replace(/'/g,"'").replace(/"/g,"\"").replace(/>/g,">").replace(/</g,"<").replace(/&/g,"&");};Sarissa.updateCursor=function(oTargetElement,sValue){if(oTargetElement&&oTargetElement.style&&oTargetElement.style.cursor!=undefined){oTargetElement.style.cursor=sValue;}};Sarissa.updateContentFromURI=function(sFromUrl,oTargetElement,xsltproc,callback,skipCache){try{Sarissa.updateCursor(oTargetElement,"wait");var xmlhttp=new XMLHttpRequest();xmlhttp.open("GET",sFromUrl,true);xmlhttp.onreadystatechange=function(){if(xmlhttp.readyState==4){try{var oDomDoc=xmlhttp.responseXML;if(oDomDoc&&Sarissa.getParseErrorText(oDomDoc)==Sarissa.PARSED_OK){Sarissa.updateContentFromNode(xmlhttp.responseXML,oTargetElement,xsltproc);if(callback){callback(sFromUrl,oTargetElement);}}
|
||||
else{throw Sarissa.getParseErrorText(oDomDoc);}}
|
||||
catch(e){if(callback){callback(sFromUrl,oTargetElement,e);}
|
||||
else{throw e;}}}};if(skipCache){var oldage="Sat, 1 Jan 2000 00:00:00 GMT";xmlhttp.setRequestHeader("If-Modified-Since",oldage);}
|
||||
xmlhttp.send("");}
|
||||
catch(e){Sarissa.updateCursor(oTargetElement,"auto");if(callback){callback(sFromUrl,oTargetElement,e);}
|
||||
else{throw e;}}};Sarissa.updateContentFromNode=function(oNode,oTargetElement,xsltproc){try{Sarissa.updateCursor(oTargetElement,"wait");Sarissa.clearChildNodes(oTargetElement);var ownerDoc=oNode.nodeType==Node.DOCUMENT_NODE?oNode:oNode.ownerDocument;if(ownerDoc.parseError&&ownerDoc.parseError.errorCode!=0){var pre=document.createElement("pre");pre.appendChild(document.createTextNode(Sarissa.getParseErrorText(ownerDoc)));oTargetElement.appendChild(pre);}
|
||||
else{if(xsltproc){oNode=xsltproc.transformToDocument(oNode);}
|
||||
if(oTargetElement.tagName.toLowerCase()=="textarea"||oTargetElement.tagName.toLowerCase()=="input"){oTargetElement.value=new XMLSerializer().serializeToString(oNode);}
|
||||
else{try{oTargetElement.appendChild(oTargetElement.ownerDocument.importNode(oNode,true));}
|
||||
catch(e){oTargetElement.innerHTML=new XMLSerializer().serializeToString(oNode);}}}}
|
||||
catch(e){throw e;}
|
||||
finally{Sarissa.updateCursor(oTargetElement,"auto");}};Sarissa.formToQueryString=function(oForm){var qs="";for(var i=0;i<oForm.elements.length;i++){var oField=oForm.elements[i];var sFieldName=oField.getAttribute("name")?oField.getAttribute("name"):oField.getAttribute("id");if(sFieldName&&((!oField.disabled)||oField.type=="hidden")){switch(oField.type){case"hidden":case"text":case"textarea":case"password":qs+=sFieldName+"="+encodeURIComponent(oField.value)+"&";break;case"select-one":qs+=sFieldName+"="+encodeURIComponent(oField.options[oField.selectedIndex].value)+"&";break;case"select-multiple":for(var j=0;j<oField.length;j++){var optElem=oField.options[j];if(optElem.selected===true){qs+=sFieldName+"[]"+"="+encodeURIComponent(optElem.value)+"&";}}
|
||||
break;case"checkbox":case"radio":if(oField.checked){qs+=sFieldName+"="+encodeURIComponent(oField.value)+"&";}
|
||||
break;}}}
|
||||
return qs.substr(0,qs.length-1);};Sarissa.updateContentFromForm=function(oForm,oTargetElement,xsltproc,callback){try{Sarissa.updateCursor(oTargetElement,"wait");var params=Sarissa.formToQueryString(oForm)+"&"+Sarissa.REMOTE_CALL_FLAG+"=true";var xmlhttp=new XMLHttpRequest();var bUseGet=oForm.getAttribute("method")&&oForm.getAttribute("method").toLowerCase()=="get";if(bUseGet){xmlhttp.open("GET",oForm.getAttribute("action")+"?"+params,true);}
|
||||
else{xmlhttp.open('POST',oForm.getAttribute("action"),true);xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");xmlhttp.setRequestHeader("Content-length",params.length);xmlhttp.setRequestHeader("Connection","close");}
|
||||
xmlhttp.onreadystatechange=function(){try{if(xmlhttp.readyState==4){var oDomDoc=xmlhttp.responseXML;if(oDomDoc&&Sarissa.getParseErrorText(oDomDoc)==Sarissa.PARSED_OK){Sarissa.updateContentFromNode(xmlhttp.responseXML,oTargetElement,xsltproc);if(callback){callback(oForm,oTargetElement);}}
|
||||
else{throw Sarissa.getParseErrorText(oDomDoc);}}}
|
||||
catch(e){if(callback){callback(oForm,oTargetElement,e);}
|
||||
else{throw e;}}};xmlhttp.send(bUseGet?"":params);}
|
||||
catch(e){Sarissa.updateCursor(oTargetElement,"auto");if(callback){callback(oForm,oTargetElement,e);}
|
||||
else{throw e;}}
|
||||
return false;};Sarissa.FUNCTION_NAME_REGEXP=new RegExp("");Sarissa.getFunctionName=function(oFunc,bForce){var name;if(!name){if(bForce){name="SarissaAnonymous"+Sarissa._getUniqueSuffix();window[name]=oFunc;}
|
||||
else{name=null;}}
|
||||
if(name){window[name]=oFunc;}
|
||||
return name;};Sarissa.setRemoteJsonCallback=function(url,callback,callbackParam){if(!callbackParam){callbackParam="callback";}
|
||||
var callbackFunctionName=Sarissa.getFunctionName(callback,true);var id="sarissa_json_script_id_"+Sarissa._getUniqueSuffix();var oHead=document.getElementsByTagName("head")[0];var scriptTag=document.createElement('script');scriptTag.type='text/javascript';scriptTag.id=id;scriptTag.onload=function(){};if(url.indexOf("?")!=-1){url+=("&"+callbackParam+"="+callbackFunctionName);}
|
||||
else{url+=("?"+callbackParam+"="+callbackFunctionName);}
|
||||
scriptTag.src=url;oHead.appendChild(scriptTag);return id;};
|
||||
34
static/cms/js/jstree/_lib/sarissa_ieemu_xpath.js
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
|
||||
/* * ====================================================================
|
||||
* About: This a a compressed JS file from the Sarissa library.
|
||||
* see http://dev.abiss.gr/sarissa
|
||||
*
|
||||
* Copyright: Manos Batsis, http://dev.abiss.gr
|
||||
*
|
||||
* Licence:
|
||||
* Sarissa is free software distributed under the GNU GPL version 2
|
||||
* or higher, GNU LGPL version 2.1 or higher and Apache Software
|
||||
* License 2.0 or higher. The licenses are available online see:
|
||||
* http://www.gnu.org
|
||||
* http://www.apache.org
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
* KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
* WARRANTIES OF MERCHANTABILITY,FITNESS FOR A PARTICULAR PURPOSE
|
||||
* AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
* ====================================================================*/
|
||||
|
||||
if(Sarissa._SARISSA_HAS_DOM_FEATURE&&document.implementation.hasFeature("XPath","3.0")){SarissaNodeList=function(i){this.length=i;};SarissaNodeList.prototype=[];SarissaNodeList.prototype.constructor=Array;SarissaNodeList.prototype.item=function(i){return(i<0||i>=this.length)?null:this[i];};SarissaNodeList.prototype.expr="";if(window.XMLDocument&&(!XMLDocument.prototype.setProperty)){XMLDocument.prototype.setProperty=function(x,y){};}
|
||||
Sarissa.setXpathNamespaces=function(oDoc,sNsSet){oDoc._sarissa_useCustomResolver=true;var namespaces=sNsSet.indexOf(" ")>-1?sNsSet.split(" "):[sNsSet];oDoc._sarissa_xpathNamespaces=[];for(var i=0;i<namespaces.length;i++){var ns=namespaces[i];var colonPos=ns.indexOf(":");var assignPos=ns.indexOf("=");if(colonPos>0&&assignPos>colonPos+1){var prefix=ns.substring(colonPos+1,assignPos);var uri=ns.substring(assignPos+2,ns.length-1);oDoc._sarissa_xpathNamespaces[prefix]=uri;}else{throw"Bad format on namespace declaration(s) given";}}};XMLDocument.prototype._sarissa_useCustomResolver=false;XMLDocument.prototype._sarissa_xpathNamespaces=[];XMLDocument.prototype.selectNodes=function(sExpr,contextNode,returnSingle){var nsDoc=this;var nsresolver;if(this._sarissa_useCustomResolver){nsresolver=function(prefix){var s=nsDoc._sarissa_xpathNamespaces[prefix];if(s){return s;}
|
||||
else{throw"No namespace URI found for prefix: '"+prefix+"'";}};}
|
||||
else{nsresolver=this.createNSResolver(this.documentElement);}
|
||||
var result=null;if(!returnSingle){var oResult=this.evaluate(sExpr,(contextNode?contextNode:this),nsresolver,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null);var nodeList=new SarissaNodeList(oResult.snapshotLength);nodeList.expr=sExpr;for(var i=0;i<nodeList.length;i++){nodeList[i]=oResult.snapshotItem(i);}
|
||||
result=nodeList;}
|
||||
else{result=this.evaluate(sExpr,(contextNode?contextNode:this),nsresolver,XPathResult.FIRST_ORDERED_NODE_TYPE,null).singleNodeValue;}
|
||||
return result;};Element.prototype.selectNodes=function(sExpr){var doc=this.ownerDocument;if(doc.selectNodes){return doc.selectNodes(sExpr,this);}
|
||||
else{throw"Method selectNodes is only supported by XML Elements";}};XMLDocument.prototype.selectSingleNode=function(sExpr,contextNode){var ctx=contextNode?contextNode:null;return this.selectNodes(sExpr,ctx,true);};Element.prototype.selectSingleNode=function(sExpr){var doc=this.ownerDocument;if(doc.selectSingleNode){return doc.selectSingleNode(sExpr,this);}
|
||||
else{throw"Method selectNodes is only supported by XML Elements";}};Sarissa.IS_ENABLED_SELECT_NODES=true;}
|
||||
80
static/cms/js/jstree/flat.xsl
Normal file
|
|
@ -0,0 +1,80 @@
|
|||
<?xml
|
||||
version="1.0"
|
||||
encoding="utf-8"
|
||||
?>
|
||||
<xsl:stylesheet
|
||||
version="1.0"
|
||||
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
|
||||
>
|
||||
<xsl:output
|
||||
method="html"
|
||||
encoding="utf-8"
|
||||
omit-xml-declaration="yes"
|
||||
standalone="no"
|
||||
indent="no"
|
||||
media-type="text/xml"
|
||||
/>
|
||||
|
||||
<xsl:param name="theme_name" />
|
||||
<xsl:param name="theme_path" />
|
||||
|
||||
<xsl:template match="/">
|
||||
<ul>
|
||||
<xsl:if test="$theme_name"><xsl:attribute name="class"><xsl:value-of select="$theme_name" /></xsl:attribute></xsl:if>
|
||||
<xsl:for-each select="//item[not(@parent_id) or @parent_id=0]">
|
||||
<xsl:call-template name="nodes">
|
||||
<xsl:with-param name="node" select="." />
|
||||
<xsl:with-param name="theme_path" select="$theme_path" />
|
||||
</xsl:call-template>
|
||||
</xsl:for-each>
|
||||
</ul>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template name="nodes">
|
||||
<xsl:param name="node" />
|
||||
<xsl:param name="theme_path" />
|
||||
|
||||
<xsl:variable name="children" select="count(//item[@parent_id=$node/attribute::id]) > 0" />
|
||||
|
||||
<li>
|
||||
<xsl:attribute name="class">
|
||||
<xsl:if test="position() = last()"> last </xsl:if>
|
||||
<xsl:choose>
|
||||
<xsl:when test="@state = 'open'"> open </xsl:when>
|
||||
<xsl:when test="$children or @hasChildren"> closed </xsl:when>
|
||||
<xsl:otherwise> leaf </xsl:otherwise>
|
||||
</xsl:choose>
|
||||
<xsl:value-of select="@class" />
|
||||
</xsl:attribute>
|
||||
<xsl:for-each select="@*">
|
||||
<xsl:if test="name() != 'parent_id' and name() != 'hasChildren' and name() != 'class' and name() != 'state'">
|
||||
<xsl:attribute name="{name()}"><xsl:value-of select="." /></xsl:attribute>
|
||||
</xsl:if>
|
||||
</xsl:for-each>
|
||||
<xsl:for-each select="content/name">
|
||||
<a href="#">
|
||||
<xsl:attribute name="class"><xsl:value-of select="@lang" /> <xsl:value-of select="@class" /></xsl:attribute>
|
||||
<xsl:attribute name="style">
|
||||
<xsl:value-of select="@style" />
|
||||
<xsl:if test="string-length(attribute::icon) > 0">background-image:url(<xsl:if test="not(contains(@icon,'/'))"><xsl:value-of select="$theme_path" /></xsl:if><xsl:value-of select="@icon" />);</xsl:if>
|
||||
</xsl:attribute>
|
||||
<xsl:for-each select="@*">
|
||||
<xsl:if test="name() != 'style' and name() != 'class'">
|
||||
<xsl:attribute name="{name()}"><xsl:value-of select="." /></xsl:attribute>
|
||||
</xsl:if>
|
||||
</xsl:for-each>
|
||||
<xsl:value-of select="." /></a>
|
||||
</xsl:for-each>
|
||||
<xsl:if test="$children or @hasChildren">
|
||||
<ul>
|
||||
<xsl:for-each select="//item[@parent_id=$node/attribute::id]">
|
||||
<xsl:call-template name="nodes">
|
||||
<xsl:with-param name="node" select="." />
|
||||
<xsl:with-param name="theme_path" select="$theme_path" />
|
||||
</xsl:call-template>
|
||||
</xsl:for-each>
|
||||
</ul>
|
||||
</xsl:if>
|
||||
</li>
|
||||
</xsl:template>
|
||||
</xsl:stylesheet>
|
||||
79
static/cms/js/jstree/nested.xsl
Normal file
|
|
@ -0,0 +1,79 @@
|
|||
<?xml
|
||||
version="1.0"
|
||||
encoding="utf-8"
|
||||
?>
|
||||
<xsl:stylesheet
|
||||
version="1.0"
|
||||
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
|
||||
>
|
||||
<xsl:output
|
||||
method="html"
|
||||
encoding="utf-8"
|
||||
omit-xml-declaration="yes"
|
||||
standalone="no"
|
||||
indent="no"
|
||||
media-type="text/html"
|
||||
/>
|
||||
|
||||
<xsl:param name="theme_name" />
|
||||
<xsl:param name="theme_path" />
|
||||
|
||||
<xsl:template match="/">
|
||||
<xsl:call-template name="nodes">
|
||||
<xsl:with-param name="node" select="/root" />
|
||||
<xsl:with-param name="theme_name" select="$theme_name" />
|
||||
<xsl:with-param name="theme_path" select="$theme_path" />
|
||||
</xsl:call-template>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template name="nodes">
|
||||
<xsl:param name="node" />
|
||||
<xsl:param name="theme_name" />
|
||||
<xsl:param name="theme_path" />
|
||||
|
||||
<ul>
|
||||
<xsl:if test="$theme_name"><xsl:attribute name="class"><xsl:value-of select="$theme_name" /></xsl:attribute></xsl:if>
|
||||
<xsl:for-each select="$node/item">
|
||||
<xsl:variable name="children" select="count(./item) > 0" />
|
||||
<li>
|
||||
<xsl:attribute name="class">
|
||||
<xsl:if test="position() = last()"> last </xsl:if>
|
||||
<xsl:choose>
|
||||
<xsl:when test="@state = 'open'"> open </xsl:when>
|
||||
<xsl:when test="$children or @hasChildren"> closed </xsl:when>
|
||||
<xsl:otherwise> leaf </xsl:otherwise>
|
||||
</xsl:choose>
|
||||
<xsl:value-of select="@class" />
|
||||
</xsl:attribute>
|
||||
<xsl:for-each select="@*">
|
||||
<xsl:if test="name() != 'class' and name() != 'state' and name() != 'hasChildren'">
|
||||
<xsl:attribute name="{name()}"><xsl:value-of select="." /></xsl:attribute>
|
||||
</xsl:if>
|
||||
</xsl:for-each>
|
||||
<xsl:for-each select="content/name">
|
||||
<a href="#">
|
||||
<xsl:attribute name="class"><xsl:value-of select="@lang" /> <xsl:value-of select="@class" /></xsl:attribute>
|
||||
<xsl:attribute name="style">
|
||||
<xsl:value-of select="@style" />
|
||||
<xsl:if test="string-length(attribute::icon) > 0">background-image:url(<xsl:if test="not(contains(@icon,'/'))"><xsl:value-of select="$theme_path" /></xsl:if><xsl:value-of select="@icon" />);</xsl:if>
|
||||
</xsl:attribute>
|
||||
<xsl:for-each select="@*">
|
||||
<xsl:if test="name() != 'style' and name() != 'class'">
|
||||
<xsl:attribute name="{name()}"><xsl:value-of select="." /></xsl:attribute>
|
||||
</xsl:if>
|
||||
</xsl:for-each>
|
||||
<xsl:value-of select="current()" /></a>
|
||||
</xsl:for-each>
|
||||
|
||||
<xsl:if test="$children or @hasChildren">
|
||||
<xsl:call-template name="nodes">
|
||||
<xsl:with-param name="node" select="current()" />
|
||||
<xsl:with-param name="theme_path" select="$theme_path" />
|
||||
</xsl:call-template>
|
||||
</xsl:if>
|
||||
</li>
|
||||
</xsl:for-each>
|
||||
</ul>
|
||||
</xsl:template>
|
||||
|
||||
</xsl:stylesheet>
|
||||
BIN
static/cms/js/jstree/themes/classic/folder.gif
Normal file
|
After Width: | Height: | Size: 365 B |
BIN
static/cms/js/jstree/themes/classic/folderopen.gif
Normal file
|
After Width: | Height: | Size: 370 B |
BIN
static/cms/js/jstree/themes/classic/minus.gif
Normal file
|
After Width: | Height: | Size: 80 B |
BIN
static/cms/js/jstree/themes/classic/plus.gif
Normal file
|
After Width: | Height: | Size: 82 B |
48
static/cms/js/jstree/themes/classic/style.css
Normal file
|
|
@ -0,0 +1,48 @@
|
|||
.tree .tree-classic li.open {
|
||||
background:url("minus.gif") 2px 5px no-repeat;
|
||||
}
|
||||
.tree .tree-classic li.closed {
|
||||
background:url("plus.gif") 2px 5px no-repeat;
|
||||
}
|
||||
.tree .tree-classic #dragged li.open {
|
||||
background:url("plus.gif") 2px 5px no-repeat;
|
||||
}
|
||||
|
||||
.tree .tree-classic li.open a {
|
||||
background-image:url("folderopen.gif");
|
||||
}
|
||||
.tree .tree-classic li.closed a {
|
||||
background-image:url("folder.gif");
|
||||
}
|
||||
.tree .tree-classic li.leaf a {
|
||||
background-image:url("folder.gif");
|
||||
}
|
||||
|
||||
.tree .tree-classic li a {
|
||||
-moz-border-radius:0;
|
||||
}
|
||||
|
||||
.tree .tree-classic li a:hover {
|
||||
background-color:white;
|
||||
border-color:white;
|
||||
}
|
||||
.tree .tree-classic li a.clicked,
|
||||
.tree .tree-classic li span.clicked {
|
||||
background-color:navy;
|
||||
border-color:navy;
|
||||
color:white;
|
||||
}
|
||||
|
||||
.rtl .tree-classic li.open {
|
||||
background-position:right 5px;
|
||||
margin-right:-3px;
|
||||
padding-right:19px;
|
||||
}
|
||||
.rtl .tree-classic li.closed {
|
||||
background-position:right 5px;
|
||||
margin-right:-3px;
|
||||
padding-right:19px;
|
||||
}
|
||||
.rtl .tree-classic #dragged li.open {
|
||||
background-position: right 5px;
|
||||
}
|
||||
BIN
static/cms/js/jstree/themes/default/context.gif
Normal file
|
After Width: | Height: | Size: 35 B |
BIN
static/cms/js/jstree/themes/default/create.png
Normal file
|
After Width: | Height: | Size: 3.3 KiB |
BIN
static/cms/js/jstree/themes/default/dot.gif
Normal file
|
After Width: | Height: | Size: 43 B |
BIN
static/cms/js/jstree/themes/default/f.png
Normal file
|
After Width: | Height: | Size: 3.2 KiB |
BIN
static/cms/js/jstree/themes/default/fminus.gif
Normal file
|
After Width: | Height: | Size: 93 B |
BIN
static/cms/js/jstree/themes/default/fminus_rtl.gif
Normal file
|
After Width: | Height: | Size: 59 B |
BIN
static/cms/js/jstree/themes/default/fplus.gif
Normal file
|
After Width: | Height: | Size: 104 B |
BIN
static/cms/js/jstree/themes/default/fplus_rtl.gif
Normal file
|
After Width: | Height: | Size: 108 B |
BIN
static/cms/js/jstree/themes/default/lastli.gif
Normal file
|
After Width: | Height: | Size: 67 B |
BIN
static/cms/js/jstree/themes/default/lastli_rtl.gif
Normal file
|
After Width: | Height: | Size: 54 B |
BIN
static/cms/js/jstree/themes/default/li.gif
Normal file
|
After Width: | Height: | Size: 47 B |
BIN
static/cms/js/jstree/themes/default/marker.gif
Normal file
|
After Width: | Height: | Size: 85 B |
BIN
static/cms/js/jstree/themes/default/marker_rtl.gif
Normal file
|
After Width: | Height: | Size: 62 B |
BIN
static/cms/js/jstree/themes/default/plus.gif
Normal file
|
After Width: | Height: | Size: 73 B |
BIN
static/cms/js/jstree/themes/default/remove.gif
Normal file
|
After Width: | Height: | Size: 606 B |
BIN
static/cms/js/jstree/themes/default/remove.png
Normal file
|
After Width: | Height: | Size: 720 B |
BIN
static/cms/js/jstree/themes/default/rename.png
Normal file
|
After Width: | Height: | Size: 3.8 KiB |
112
static/cms/js/jstree/themes/default/style.css
Normal file
|
|
@ -0,0 +1,112 @@
|
|||
/* DOTS */
|
||||
.tree .tree-default,
|
||||
.tree .tree-default ul {
|
||||
background-image:url("dot.gif");
|
||||
}
|
||||
.tree .tree-default li {
|
||||
background-image:url("li.gif");
|
||||
}
|
||||
.tree .tree-default li.last {
|
||||
background-image:url("lastli.gif");
|
||||
}
|
||||
|
||||
/* OPEN or CLOSED */
|
||||
.tree .tree-default li.open {
|
||||
background:url("fminus.gif") 0px 0px no-repeat;
|
||||
}
|
||||
|
||||
.tree .tree-default li.closed {
|
||||
background:url("fplus.gif") 0px 0px no-repeat;
|
||||
}
|
||||
|
||||
.tree .tree-default #dragged li.open {
|
||||
background:url("fplus.gif") 5px 5px no-repeat;
|
||||
}
|
||||
|
||||
/* RIGHT TO LEFT SUPPORT */
|
||||
.rtl .tree-default li {
|
||||
margin-right:1px;
|
||||
}
|
||||
.rtl .tree-default li.last {
|
||||
background-image:url("lastli_rtl.gif");
|
||||
margin-right:0;
|
||||
padding-right:16px;
|
||||
}
|
||||
.rtl .tree-default li.open {
|
||||
background:url("fminus_rtl.gif") right 6px no-repeat;
|
||||
margin-right:0;
|
||||
padding-right:16px;
|
||||
}
|
||||
.rtl .tree-default li.closed {
|
||||
background:url("fplus_rtl.gif") right 4px no-repeat;
|
||||
margin-right:0;
|
||||
padding-right:16px;
|
||||
}
|
||||
.rtl .tree-default #dragged li.open {
|
||||
background-position: right 5px;
|
||||
}
|
||||
|
||||
/* DEFAULT ICON */
|
||||
.tree .tree-default li a.title{
|
||||
background-image:url("f.png");
|
||||
}
|
||||
|
||||
/* CONTEXT MENU
|
||||
.tree .tree-default .context {
|
||||
width:160px;
|
||||
background:#F0F0F0 url("context.gif") 22px 0 repeat-y;
|
||||
border:1px solid silver;
|
||||
}
|
||||
.tree .tree-default .context a,
|
||||
.tree .tree-default .context a:hover {
|
||||
text-decoration:none;
|
||||
color:black;
|
||||
text-indent:26px;
|
||||
line-height:20px;
|
||||
background-repeat: no-repeat;
|
||||
background-position: 3px center;
|
||||
padding:1px 0;
|
||||
}
|
||||
.tree .tree-default .context a:hover {
|
||||
background-color: #e7f4f9;
|
||||
border:1px solid #d8f0fa;
|
||||
background-position: 2px center;
|
||||
padding:0;
|
||||
text-indent:25px;
|
||||
}
|
||||
|
||||
.tree .tree-default .context .separator {
|
||||
background:#FFFFFF;;
|
||||
border-top:1px solid #E0E0E0;
|
||||
font-size:1px;
|
||||
height:1px;
|
||||
line-height:1px;
|
||||
margin:0 2px 0 24px;
|
||||
min-height:1px;
|
||||
display:block;
|
||||
}
|
||||
*/
|
||||
|
||||
/*
|
||||
.tree .tree-default a:hover{
|
||||
background-color:transparent;
|
||||
border-color:#fff;
|
||||
|
||||
}*/
|
||||
|
||||
|
||||
#sitemap li div{display:inline;}
|
||||
#sitemap li .cont{
|
||||
display:block;
|
||||
height:28px;
|
||||
border:1px solid #DEDEDC;
|
||||
border-top:none;
|
||||
border-right:none;
|
||||
overflow:hidden;
|
||||
}
|
||||
#sitemap li .col1{
|
||||
float:left;
|
||||
}
|
||||
#sitemap li .col2{
|
||||
float:right;
|
||||
}
|
||||
BIN
static/cms/js/jstree/themes/default/throbber.gif
Normal file
|
After Width: | Height: | Size: 1.8 KiB |
236
static/cms/js/jstree/tree_component.css
Normal file
|
|
@ -0,0 +1,236 @@
|
|||
/* TREE LAYOUT */
|
||||
.tree ul {
|
||||
margin:0 0 0 5px;
|
||||
padding:0;
|
||||
list-style-type:none;
|
||||
}
|
||||
.tree li {
|
||||
display:block;
|
||||
min-height:18px;
|
||||
line-height:18px;
|
||||
padding:0 0 0 15px;
|
||||
margin:0 0 0 0;
|
||||
clear:both;
|
||||
}
|
||||
.tree li ul {
|
||||
display:none;
|
||||
clear:both;
|
||||
}
|
||||
/*
|
||||
.tree li a,
|
||||
.tree li span {
|
||||
display:inline;
|
||||
float:left;
|
||||
line-height:16px;
|
||||
height:16px;
|
||||
padding:1px 4px 1px 23px !important;
|
||||
color:black;
|
||||
white-space:nowrap;
|
||||
text-decoration:none;
|
||||
background-color:transparent;
|
||||
background-repeat:no-repeat;
|
||||
background-position:4px 1px;
|
||||
-moz-border-radius:3px;
|
||||
border:0;
|
||||
margin:0;
|
||||
}*/
|
||||
/*
|
||||
.tree li a:hover,
|
||||
.tree li a.hover {
|
||||
background-color: #e7f4f9;
|
||||
border:1px solid #d8f0fa;
|
||||
padding:0px 3px 0px 22px !important;
|
||||
background-position:3px 0px;
|
||||
}
|
||||
*/
|
||||
|
||||
/*
|
||||
.tree li a.clicked,
|
||||
.tree li a.clicked:hover,
|
||||
.tree li span.clicked {
|
||||
background-color: #beebff;
|
||||
border:1px solid #99defd;
|
||||
padding:0px 3px 0px 22px !important;
|
||||
background-position:3px 0px;
|
||||
}*/
|
||||
.tree li span.clicked {
|
||||
padding:0px 3px 0px 20px !important;
|
||||
}
|
||||
|
||||
.tree li a input,
|
||||
.tree li span input {
|
||||
margin:0;
|
||||
padding:0 0;
|
||||
display:block;
|
||||
height:12px !important;
|
||||
border:1px solid white;
|
||||
background:white;
|
||||
font-size:10px;
|
||||
font-family:Verdana;
|
||||
}
|
||||
.tree li a input:not([class="xxx"]),
|
||||
.tree li span input:not([class="xxx"]) {
|
||||
padding:1px 0;
|
||||
}
|
||||
|
||||
.locked li a {
|
||||
color:gray;
|
||||
}
|
||||
|
||||
/* FOR DOTS */
|
||||
.tree ul {
|
||||
background-position:6px 1px;
|
||||
background-repeat:repeat-y;
|
||||
}
|
||||
.tree li {
|
||||
background-position:7px center;
|
||||
background-repeat:no-repeat;
|
||||
}
|
||||
.tree li.last {
|
||||
background-position:5px top;
|
||||
background-repeat:no-repeat;
|
||||
}
|
||||
/* NO DOTS */
|
||||
.no_dots ul {
|
||||
background:transparent;
|
||||
}
|
||||
.no_dots li {
|
||||
background:transparent;
|
||||
}
|
||||
.no_dots li.last {
|
||||
background:transparent;
|
||||
background-color:transparent !important;
|
||||
}
|
||||
|
||||
/* OPEN OR CLOSE */
|
||||
.tree li.open ul {
|
||||
display:block;
|
||||
clear:both;
|
||||
}
|
||||
.tree li.closed ul {
|
||||
display:none !important;
|
||||
}
|
||||
|
||||
|
||||
/* FOR DRAGGING */
|
||||
.tree #dragged {
|
||||
padding:0 3px;
|
||||
margin:0;
|
||||
background:white;
|
||||
opacity: .85;
|
||||
filter: alpha(opacity=85);
|
||||
|
||||
position:absolute;
|
||||
top:-10px;
|
||||
left:-10px;
|
||||
}
|
||||
.tree #dragged.last,
|
||||
.tree #dragged:last-child {
|
||||
background:white;
|
||||
}
|
||||
.tree #dragged ul ul {
|
||||
display:none;
|
||||
}
|
||||
|
||||
/* HACKY-HACKY */
|
||||
/* EXPLORER 7 */
|
||||
*:first-child+html .tree li {
|
||||
margin-bottom:-2px;
|
||||
}
|
||||
*:first-child+html .tree li ul {
|
||||
padding-bottom:2px;
|
||||
}
|
||||
/* EXPLORER 6 */
|
||||
|
||||
.tree li {
|
||||
/*_width:50%;*/
|
||||
_margin-bottom:-2px;
|
||||
}
|
||||
.tree li ul {
|
||||
_padding-bottom:2px;
|
||||
}
|
||||
|
||||
/*
|
||||
* FF & OPERA FIXES
|
||||
.tree li:not([class="xxx"]) {
|
||||
margin-bottom:0px;
|
||||
}
|
||||
html:first-child .tree li {
|
||||
margin-bottom:0px;
|
||||
}
|
||||
.tree li ul:not([class="xxx"]) {
|
||||
padding-bottom:0;
|
||||
}
|
||||
html:first-child .tree ul {
|
||||
padding-bottom:0;
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
/* RTL modification */
|
||||
.rtl * {
|
||||
direction:rtl;
|
||||
}
|
||||
.rtl ul {
|
||||
margin:0 5px 0 0;
|
||||
}
|
||||
.rtl li {
|
||||
padding:0 15px 0 0;
|
||||
}
|
||||
.rtl li.last {
|
||||
background-position:right top;
|
||||
}
|
||||
.rtl li a,
|
||||
.rtl li span {
|
||||
float:right;
|
||||
padding:1px 23px 1px 4px !important;
|
||||
background-position:right 1px;
|
||||
margin-right:1px;
|
||||
}
|
||||
.rtl li a:hover,
|
||||
.rtl li a.hover {
|
||||
background-color: #e7f4f9;
|
||||
border:1px solid #d8f0fa;
|
||||
padding:0px 23px 0px 3px !important;
|
||||
background-position:right 0px;
|
||||
margin-right:0px;
|
||||
}
|
||||
.rtl li a.clicked,
|
||||
.rtl li a.clicked:hover,
|
||||
.rtl li span.clicked {
|
||||
background-color: #beebff;
|
||||
border:1px solid #99defd;
|
||||
padding:0px 23px 0px 3px !important;
|
||||
background-position:right 0px;
|
||||
margin-right:0px;
|
||||
}
|
||||
.rtl li span.clicked {
|
||||
padding:0px 21px 0px 3px !important;
|
||||
}
|
||||
|
||||
.rtl ul {
|
||||
background-position:right 1px;
|
||||
}
|
||||
.rtl li {
|
||||
background-position:right center;
|
||||
}
|
||||
.rtl #dragged li.open {
|
||||
background-position: right 5px;
|
||||
}
|
||||
|
||||
/* CONTEXT MENU */
|
||||
.tree .context {
|
||||
display:none;
|
||||
position:absolute;
|
||||
list-style-type:none;
|
||||
margin:0;
|
||||
padding:0;
|
||||
}
|
||||
.tree .context .separator {
|
||||
display:none;
|
||||
}
|
||||
.tree .context a {
|
||||
display:block;
|
||||
margin:0;
|
||||
padding:0;
|
||||
}
|
||||
1761
static/cms/js/jstree/tree_component.js
Normal file
6
static/cms/js/libs/class.min.js
vendored
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
/*!
|
||||
* @author Angelo Dini
|
||||
* @version 1.0
|
||||
* @copyright Distributed under the BSD License.
|
||||
*/
|
||||
(function(){var d="1.0";var c=window.Class;var b=window.Class=function(n){n=n||{};var m=function(){return(this.initialize)?this.initialize.apply(this,arguments):j};if(n.implement){var j=window===this?g(m.prototype):this;var l=n.implement;a(n,"implement");n=f(n,e(l))}m.prototype=g(n);m.constructor=m;m._parent=g(n);for(var k=0,h=["extend","implement","getOptions","setOptions"];k<h.length;k++){m[h[k]]=b[h[k]]}return m};b.extend=function(j){var h=this;if(j.implement){this.prototype=f(this.prototype,e(j.implement));a(j,"implement")}for(var i in j){j[i]=typeof j[i]==="function"&&/parent/.test(j[i].toString())?(function(l,k){return function(){this.parent=h._parent[k];return l.apply(this,arguments)}})(j[i],i):j[i]}this._parent=f(this._parent,j,true);this.prototype=f(this.prototype,j);return this};b.implement=function(h){return this.prototype=f(this.prototype,e(h))};b.getOptions=function(){return this.prototype.options||{}};b.setOptions=function(h){return this.prototype.options=f(this.prototype.options,h)};b.noConflict=function(){window.Class=c;return b};b.version=d;function g(i){var h=function(){};h.prototype=i.prototype||i;return new h()}function a(l,i,k){if(k){var h={};for(var j in l){if(j!==i){h[j]=l[j]}}}else{delete l[i]}return h||l}function f(h,i,k){if(!h||!i){return h||i||{}}h=g(h);i=g(i);for(var j in i){if(Object.prototype.toString.call(i[j])==="[object Object]"){f(h[j],i[j])}else{h[j]=(k&&h[j])?h[j]:i[j]}}return h}function e(l){var k={};for(var h=0;h<l.length;h++){if(typeof(l[h])==="function"){l[h]=l[h].prototype}var j=a(l[h],"initialize",true);if(j.implement){k=e(j.implement)}else{k=f(k,j)}}return k}})();
|
||||
4
static/cms/js/libs/jquery.min.js
vendored
Normal file
4
static/cms/js/libs/swfobject.min.js
vendored
Normal file
79
static/cms/js/modules/cms.app_hook_select.js
Normal file
|
|
@ -0,0 +1,79 @@
|
|||
/*##################################################|*/
|
||||
/* #CMS.API# */
|
||||
/* global apphooks_configuration */
|
||||
(function($) {
|
||||
// CMS.$ will be passed for $
|
||||
$(document).ready(function () {
|
||||
|
||||
var appHooks = $('#application_urls'),
|
||||
selected = appHooks.find('option:selected'),
|
||||
appNsRow = $('.form-row.application_namespace'),
|
||||
appNs = appNsRow.find('#id_application_namespace'),
|
||||
appCfgsRow = $('.form-row.application_configs'),
|
||||
appCfgs = appCfgsRow.find('#application_configs'),
|
||||
appCfgsAdd = appCfgsRow.find('#add_application_configs'),
|
||||
original_ns = appNs.val();
|
||||
|
||||
// Shows / hides namespace / config selection widgets depending on the user input
|
||||
appHooks.setupNamespaces = function() {
|
||||
var opt = $(this).find('option:selected');
|
||||
|
||||
if($(appCfgs).length > 0 && apphooks_configuration[opt.val()]){
|
||||
appCfgs.html('');
|
||||
for(var i=0; i < apphooks_configuration[opt.val()].length; i++) {
|
||||
selectedCfgs = '';
|
||||
if(apphooks_configuration[opt.val()][i][0] == apphooks_configuration_value) {
|
||||
selectedCfgs = 'selected="selected"';
|
||||
}
|
||||
appCfgs.append('<option ' + selectedCfgs + ' value="' + apphooks_configuration[opt.val()][i][0] + '">' + apphooks_configuration[opt.val()][i][1] + '</option>')
|
||||
}
|
||||
appCfgsAdd.attr('href', apphooks_configuration_url[opt.val()]);
|
||||
appCfgsRow.removeClass('hidden');
|
||||
appNsRow.addClass('hidden');
|
||||
}
|
||||
else {
|
||||
appCfgsRow.addClass('hidden');
|
||||
if(opt.data('namespace')) {
|
||||
appNsRow.removeClass('hidden');
|
||||
}
|
||||
else {
|
||||
appNsRow.addClass('hidden');
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// Hide the namespace widgets if its not required.
|
||||
appHooks.setupNamespaces();
|
||||
|
||||
// Show it if we change to an app_hook that requires a namespace
|
||||
appHooks.on('change', function(){
|
||||
var self = $(this),
|
||||
opt = self.find('option:selected');
|
||||
|
||||
appHooks.setupNamespaces();
|
||||
|
||||
// If we clear the app_hook, clear out the app_namespace too
|
||||
if (!self.val()) {
|
||||
appNs.val('');
|
||||
appNs.removeAttr('value');
|
||||
}
|
||||
|
||||
// When selecting back the original apphook we try
|
||||
// to restore the original configuration
|
||||
if(selected.val() == opt.val()) {
|
||||
if(original_ns) {
|
||||
appNs.val(original_ns);
|
||||
}
|
||||
}
|
||||
// If new apphook has a namespace, suggest the default
|
||||
else if (opt.data('namespace')) {
|
||||
appNs.val(opt.data('namespace'));
|
||||
}
|
||||
// Cleanup the whole thing
|
||||
else {
|
||||
appNs.val('');
|
||||
appNs.removeAttr('value');
|
||||
}
|
||||
});
|
||||
});
|
||||
})(CMS.$);
|
||||
242
static/cms/js/modules/cms.base.js
Normal file
|
|
@ -0,0 +1,242 @@
|
|||
/*##################################################|*/
|
||||
/* #CMS# */
|
||||
|
||||
// ensuring django namespace is set correctly
|
||||
window.django = window.django || undefined;
|
||||
|
||||
// ensuring jQuery namespace is set correctly
|
||||
window.jQuery = (django && django.jQuery) ? django.jQuery : window.jQuery || undefined;
|
||||
|
||||
// ensuring Class namespace is set correctly
|
||||
window.Class = window.Class || undefined;
|
||||
|
||||
// ensuring CMS namespace is set correctly
|
||||
var CMS = {
|
||||
'$': (typeof jQuery === 'function') ? jQuery : undefined,
|
||||
'Class': (typeof Class === 'function') ? Class : undefined,
|
||||
'API': {}
|
||||
};
|
||||
|
||||
/*##################################################|*/
|
||||
/* #CMS.API# */
|
||||
(function($) {
|
||||
// CMS.$ will be passed for $
|
||||
$(document).ready(function () {
|
||||
/*!
|
||||
* CNS.API.Helpers
|
||||
* Multiple helpers used accross all CMS features
|
||||
*/
|
||||
CMS.API.Helpers = {
|
||||
|
||||
// redirects to a specific url or reloads browser
|
||||
reloadBrowser: function (url, timeout, ajax) {
|
||||
var that = this;
|
||||
// is there a parent window?
|
||||
var parent = (window.parent) ? window.parent : window;
|
||||
|
||||
// if there is an ajax reload, prioritize
|
||||
if(ajax) {
|
||||
parent.CMS.API.locked = true;
|
||||
// check if the url has changed, if true redirect to the new path
|
||||
// this requires an ajax request
|
||||
$.ajax({
|
||||
'async': false,
|
||||
'type': 'GET',
|
||||
'url': parent.CMS.config.request.url,
|
||||
'data': {
|
||||
'model': parent.CMS.config.request.model,
|
||||
'pk': parent.CMS.config.request.pk
|
||||
},
|
||||
'success': function (response) {
|
||||
parent.CMS.API.locked = false;
|
||||
|
||||
if(response === '' && !url) {
|
||||
// cancel if response is empty
|
||||
return false;
|
||||
} else if(parent.location.pathname !== response) {
|
||||
// api call to the backend to check if the current path is still the same
|
||||
that.reloadBrowser(response);
|
||||
} else if(url === 'REFRESH_PAGE') {
|
||||
// if on_close provides REFRESH_PAGE, only do a reload
|
||||
that.reloadBrowser();
|
||||
} else if(url) {
|
||||
// on_close can also provide a url, reload to the new destination
|
||||
that.reloadBrowser(url);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// cancel further operations
|
||||
return false;
|
||||
}
|
||||
|
||||
// add timeout if provided
|
||||
parent.setTimeout(function () {
|
||||
if (url && url != parent.location.href) {
|
||||
// location.reload() takes precedence over this, so we
|
||||
// don't want to reload the page if we need a redirect
|
||||
parent.location.href = url;
|
||||
}
|
||||
else {
|
||||
// ensure page is always reloaded #3413
|
||||
parent.location.reload()
|
||||
}
|
||||
}, timeout || 0);
|
||||
},
|
||||
|
||||
// disable multiple form submissions
|
||||
preventSubmit: function () {
|
||||
var forms = $('#cms_toolbar').find('form');
|
||||
forms.submit(function () {
|
||||
// show loader
|
||||
CMS.API.Toolbar._loader(true);
|
||||
// we cannot use disabled as the name action will be ignored
|
||||
$('input[type="submit"]').bind('click', function (e) {
|
||||
e.preventDefault();
|
||||
}).css('opacity', 0.5);
|
||||
});
|
||||
},
|
||||
|
||||
// fixes csrf behaviour
|
||||
csrf: function (csrf_token) {
|
||||
$.ajaxSetup({
|
||||
beforeSend: function (xhr) {
|
||||
// set csrf_token
|
||||
xhr.setRequestHeader("X-CSRFToken", csrf_token);
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
// handles the tooltip for the plugins
|
||||
showTooltip: function (name, id) {
|
||||
var tooltip = $('.cms_tooltip');
|
||||
|
||||
// change css and attributes
|
||||
tooltip.css('visibility', 'visible')
|
||||
.data('plugin_id', id || null)
|
||||
.show()
|
||||
.find('span').html(name);
|
||||
|
||||
// attaches move event
|
||||
// this sets the correct position for the edit tooltip
|
||||
$('body').bind('mousemove.cms', function (e) {
|
||||
// so lets figure out where we are
|
||||
var offset = 20;
|
||||
var relX = e.pageX - $(tooltip).offsetParent().offset().left;
|
||||
var relY = e.pageY - $(tooltip).offsetParent().offset().top;
|
||||
var bound = $(tooltip).offsetParent().width();
|
||||
var pos = relX + tooltip.outerWidth(true) + offset;
|
||||
|
||||
tooltip.css({
|
||||
'left': (pos >= bound) ? relX - tooltip.outerWidth(true) - offset : relX + offset,
|
||||
'top': relY - 12
|
||||
});
|
||||
});
|
||||
|
||||
// attach tooltip event for touch devices
|
||||
tooltip.bind('touchstart.cms', function () {
|
||||
$('.cms_plugin-' + $(this).data('plugin_id')).trigger('dblclick');
|
||||
});
|
||||
},
|
||||
|
||||
hideTooltip: function () {
|
||||
var tooltip = $('.cms_tooltip');
|
||||
|
||||
// change css
|
||||
tooltip.css('visibility', 'hidden').hide();
|
||||
|
||||
// unbind events
|
||||
$('body').unbind('mousemove.cms');
|
||||
tooltip.unbind('touchstart.cms');
|
||||
},
|
||||
|
||||
// sends or retrieves a JSON from localStorage or the session if local storage is not available
|
||||
setSettings: function (settings) {
|
||||
var that = this;
|
||||
// merge settings
|
||||
settings = JSON.stringify($.extend({}, CMS.config.settings, settings));
|
||||
// set loader
|
||||
if(CMS.API.Toolbar) CMS.API.Toolbar._loader(true);
|
||||
|
||||
// use local storage or session
|
||||
if(window.localStorage) {
|
||||
// save within local storage
|
||||
localStorage.setItem('cms_cookie', settings);
|
||||
if(CMS.API.Toolbar) CMS.API.Toolbar._loader(false);
|
||||
} else {
|
||||
// save within session
|
||||
CMS.API.locked = true;
|
||||
|
||||
$.ajax({
|
||||
'async': false,
|
||||
'type': 'POST',
|
||||
'url': CMS.config.urls.settings,
|
||||
'data': {
|
||||
'csrfmiddlewaretoken': this.config.csrf,
|
||||
'settings': settings
|
||||
},
|
||||
'success': function (data) {
|
||||
CMS.API.locked = false;
|
||||
// determine if logged in or not
|
||||
settings = (data) ? JSON.parse(data) : CMS.config.settings;
|
||||
if(CMS.API.Toolbar) CMS.API.Toolbar._loader(false);
|
||||
},
|
||||
'error': function (jqXHR) {
|
||||
that.showError(jqXHR.response + ' | ' + jqXHR.status + ' ' + jqXHR.statusText);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// save settings
|
||||
CMS.settings = JSON.parse(settings);
|
||||
|
||||
// ensure new settings are returned
|
||||
return CMS.settings;
|
||||
},
|
||||
|
||||
getSettings: function () {
|
||||
var that = this;
|
||||
var settings;
|
||||
// set loader
|
||||
if(CMS.API.Toolbar) CMS.API.Toolbar._loader(true);
|
||||
|
||||
// use local storage or session
|
||||
if(window.localStorage) {
|
||||
// get from local storage
|
||||
settings = JSON.parse(localStorage.getItem('cms_cookie'));
|
||||
if(CMS.API.Toolbar) CMS.API.Toolbar._loader(false);
|
||||
} else {
|
||||
CMS.API.locked = true;
|
||||
// get from session
|
||||
$.ajax({
|
||||
'async': false,
|
||||
'type': 'GET',
|
||||
'url': CMS.config.urls.settings,
|
||||
'success': function (data) {
|
||||
CMS.API.locked = false;
|
||||
// determine if logged in or not
|
||||
settings = (data) ? JSON.parse(data) : CMS.config.settings;
|
||||
if(CMS.API.Toolbar) CMS.API.Toolbar._loader(false);
|
||||
},
|
||||
'error': function (jqXHR) {
|
||||
that.showError(jqXHR.response + ' | ' + jqXHR.status + ' ' + jqXHR.statusText);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if(settings === null) settings = this.setSettings(CMS.config.settings);
|
||||
|
||||
// save settings
|
||||
CMS.settings = settings;
|
||||
|
||||
// ensure new settings are returned
|
||||
return CMS.settings;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
// autoinits
|
||||
CMS.API.Helpers.preventSubmit();
|
||||
|
||||
});
|
||||
})(CMS.$);
|
||||
67
static/cms/js/modules/cms.changeform.js
Normal file
|
|
@ -0,0 +1,67 @@
|
|||
/*##################################################|*/
|
||||
/* #CMS# */
|
||||
(function($) {
|
||||
// CMS.$ will be passed for $
|
||||
$(document).ready(function () {
|
||||
|
||||
// set local variables
|
||||
var title= $('#id_title');
|
||||
var slug = $('#id_slug');
|
||||
var changed = false;
|
||||
var prefill = false;
|
||||
|
||||
// hide rows when hidden input fields are added
|
||||
$('input[type="hidden"]').each(function () {
|
||||
$(this).parent('.form-row').hide()
|
||||
});
|
||||
|
||||
// determine if slug is empty
|
||||
if(slug.val() === '') prefill = true;
|
||||
|
||||
// always bind the title > slug generation and do the validation inside for better ux
|
||||
title.bind('keyup', function() {
|
||||
var value = title.val();
|
||||
// international language handling
|
||||
if(window.UNIHANDECODER) value = UNIHANDECODER.decode(value);
|
||||
// if slug is empty, prefill again
|
||||
if(prefill === false && slug.val() === '') prefill = true;
|
||||
// urlify
|
||||
var urlified = URLify(value, 64);
|
||||
if(prefill) slug.val(urlified);
|
||||
});
|
||||
// autocall
|
||||
title.trigger('keyup');
|
||||
|
||||
// set focus to title
|
||||
title.focus();
|
||||
|
||||
// all permissions and page states loader
|
||||
$('div.loading').each(function () {
|
||||
$(this).load($(this).attr('rel'));
|
||||
});
|
||||
|
||||
// add changed data bindings to elements
|
||||
slug.add(title).bind('change', function () {
|
||||
$(this).data('changed', true);
|
||||
});
|
||||
|
||||
// public api for changing the language tabs
|
||||
// used in admin/cms/page/change_form.html
|
||||
CMS.API.changeLanguage = function (url) {
|
||||
// also make sure that we will display the confirm dialog
|
||||
// in case users switch tabs while editing plugins
|
||||
var answer = true;
|
||||
if(slug.length) {
|
||||
// check if the slug has the changed attribute
|
||||
if(slug.data('changed') || title.data('changed')) changed = true;
|
||||
}
|
||||
|
||||
if(changed) {
|
||||
var question = gettext("Are you sure you want to change tabs without saving the page first?");
|
||||
answer = confirm(question);
|
||||
}
|
||||
if(answer) window.location.href = url;
|
||||
};
|
||||
|
||||
});
|
||||
})(CMS.$);
|
||||
779
static/cms/js/modules/cms.changelist.js
Normal file
|
|
@ -0,0 +1,779 @@
|
|||
/*##################################################|*/
|
||||
/* #CMS# */
|
||||
(function($) {
|
||||
// CMS.$ will be passed for $
|
||||
$(document).ready(function () {
|
||||
/*!
|
||||
* TreeManager
|
||||
* Handles treeview
|
||||
* TODO this will be refactored in 3.1
|
||||
*/
|
||||
CMS.TreeManager = new CMS.Class({
|
||||
|
||||
options: {
|
||||
'lang': {}
|
||||
},
|
||||
|
||||
initialize: function (options) {
|
||||
this.options = $.extend(true, {}, this.options, options);
|
||||
|
||||
// load internal functions
|
||||
if(!this.options.settings.filtered) {
|
||||
this.setupFunctions();
|
||||
this.setupTreePublishing();
|
||||
this.setupUIHacks();
|
||||
this.setupGlobals();
|
||||
this.setupTree();
|
||||
|
||||
// init tree component
|
||||
initTree();
|
||||
} else {
|
||||
// when filtered is active, prevent tree actions
|
||||
this.setupUIHacks();
|
||||
}
|
||||
},
|
||||
|
||||
setupFunctions: function () {
|
||||
var that = this;
|
||||
|
||||
$.syncCols = function(){
|
||||
$('#sitemap .col-softroot').syncWidth(0);
|
||||
$('#sitemap .col-apphook').syncWidth(0);
|
||||
$('#sitemap .col-language').syncWidth(0);
|
||||
$('#sitemap .col-navigation').syncWidth(0);
|
||||
$('#sitemap .col-actions').syncWidth(0);
|
||||
$('#sitemap .col-info').syncWidth(0);
|
||||
|
||||
that.refreshColumns.call($('ul.tree-default li'));
|
||||
};
|
||||
|
||||
/* Colums width sync */
|
||||
$.fn.syncWidth = function(max) {
|
||||
var visible = false;
|
||||
|
||||
$(this).each(function() {
|
||||
if($(this).is(':visible')) {
|
||||
visible = true;
|
||||
var val= $(this).width();
|
||||
if(val > max){
|
||||
max = val;
|
||||
}
|
||||
}
|
||||
});
|
||||
if (visible && max > 0) {
|
||||
$(this).each(function() {
|
||||
$(this).css('width', max);
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
// jquery.functional
|
||||
$.curry = function(fn) {
|
||||
if (arguments.length < 2) return fn;
|
||||
args = $.makeArray(arguments).slice(1, arguments.length);
|
||||
return function() {
|
||||
return fn.apply(this, args.concat($.makeArray(arguments)));
|
||||
}
|
||||
};
|
||||
|
||||
$.__callbackPool = {};
|
||||
|
||||
$.callbackRegister = function(name, fn /*, arg0, arg1, ..*/){
|
||||
if (arguments.length > 2) {
|
||||
// create curried function
|
||||
fn = $.curry.apply(this, $.makeArray(arguments).slice(1, arguments.length));
|
||||
}
|
||||
$.__callbackPool[name] = fn;
|
||||
return name;
|
||||
};
|
||||
|
||||
$.callbackCall = function(name/*, extra arg0, extra arg1, ..*/){
|
||||
if (!name || !name in $.__callbackPool) {
|
||||
throw "No callback registered with name: " + name;
|
||||
}
|
||||
$.__callbackPool[name].apply(this, $.makeArray(arguments).slice(1, arguments.length));
|
||||
$.callbackRemove(name);
|
||||
return name;
|
||||
};
|
||||
|
||||
$.callbackRemove = function(name) {
|
||||
delete $.__callbackPool[name];
|
||||
};
|
||||
|
||||
// very simple yellow fade plugin..
|
||||
$.fn.yft = function(){
|
||||
this.effect("highlight", {}, 1000);
|
||||
};
|
||||
|
||||
// jquery replace plugin :)
|
||||
$.fn.replace = function(o) {
|
||||
return this.after(o).remove().end();
|
||||
};
|
||||
|
||||
},
|
||||
|
||||
setupTreePublishing: function () {
|
||||
// ADD DIRECT PUBLISHING
|
||||
var that = this;
|
||||
var tree = $('.tree');
|
||||
var langTrigger = '.col-language .trigger-tooltip span';
|
||||
var langTooltips = '.language-tooltip';
|
||||
var langTimer = function () {};
|
||||
var langDelay = 100;
|
||||
var langFadeDuration = 200;
|
||||
|
||||
// show the tooltip
|
||||
tree.delegate(langTrigger, 'mouseenter', function () {
|
||||
var el = $(this).closest('.col-language').find('.language-tooltip');
|
||||
var anchors = el.find('a');
|
||||
var span = $(this);
|
||||
|
||||
// clear timer
|
||||
clearTimeout(langTimer);
|
||||
|
||||
// cancel if tooltip already visible
|
||||
if(el.is(':visible')) return false;
|
||||
|
||||
// set correct position
|
||||
el.css('right', 20 + $(this).position().left);
|
||||
|
||||
// figure out what should be shown
|
||||
anchors.hide();
|
||||
if(span.hasClass('unpublished') || span.hasClass('unpublishedparent')) anchors.eq(1).show();
|
||||
if(span.hasClass('published')) anchors.eq(0).show();
|
||||
if(span.hasClass('dirty')) anchors.show().parent().addClass('language-tooltip-multiple');
|
||||
|
||||
// hide all elements
|
||||
$(langTooltips).fadeOut(langDelay);
|
||||
|
||||
// use a timeout to display the tooltip
|
||||
langTimer = setTimeout(function () {
|
||||
el.stop(true, true).fadeIn(langFadeDuration);
|
||||
}, langDelay);
|
||||
});
|
||||
// hide the tooltip when leaving the area
|
||||
tree.delegate(langTrigger, 'mouseleave', function () {
|
||||
// clear timer
|
||||
clearTimeout(langTimer);
|
||||
// hide all elements
|
||||
langTimer = setTimeout(function () {
|
||||
$(langTooltips).fadeOut(langFadeDuration);
|
||||
}, langDelay * 2);
|
||||
});
|
||||
// reset hiding when entering the tooltip itself
|
||||
tree.delegate(langTooltips, 'mouseover', function () {
|
||||
// clear timer
|
||||
clearTimeout(langTimer);
|
||||
});
|
||||
tree.delegate(langTooltips, 'mouseleave', function () {
|
||||
// hide all elements
|
||||
langTimer = setTimeout(function () {
|
||||
$(langTooltips).fadeOut(langFadeDuration);
|
||||
}, langDelay * 2);
|
||||
});
|
||||
// attach double check event if publish or unpublish should be triggered
|
||||
tree.delegate('.language-tooltip a', 'click', function (e) {
|
||||
e.preventDefault();
|
||||
|
||||
// cancel if not confirmed
|
||||
if(!confirm(that.options.lang.publish.replace('§', $(this).text().toLowerCase()))) return false;
|
||||
|
||||
// publish page and update
|
||||
window.location.href = $(this).attr('href');
|
||||
});
|
||||
},
|
||||
|
||||
setupUIHacks: function () {
|
||||
// enables tab click on title entry to open in new window
|
||||
$('.tree').delegate('.col1 .title', 'click', function (e) {
|
||||
if(!e.metaKey) {
|
||||
window.top.location.href = $(this).attr('href');
|
||||
} else {
|
||||
window.open($(this).attr('href'), '_blank');
|
||||
}
|
||||
});
|
||||
|
||||
// adds functionality to the filter
|
||||
$('#changelist-filter-button').bind('click', function () {
|
||||
$("#changelist-filter").toggle();
|
||||
});
|
||||
|
||||
// set correct active entry
|
||||
if(window.parent && window.parent.CMS && window.parent.CMS.config) {
|
||||
var page_id = window.parent.CMS.config.request.page_id;
|
||||
|
||||
$('div[data-page_id="'+page_id+'"]').addClass('cont-active');
|
||||
}
|
||||
},
|
||||
|
||||
setupGlobals: function () {
|
||||
var that = this;
|
||||
var msg = '';
|
||||
var parent = null;
|
||||
|
||||
window.moveSuccess = function(node){
|
||||
$.syncCols();
|
||||
|
||||
msg = $('<span class="success">'+that.options.lang.success+'</span>');
|
||||
parent = window.parent;
|
||||
|
||||
node.after(msg);
|
||||
node.parent().find('.col2').hide();
|
||||
msg.fadeOut(1000, function () {
|
||||
node.parent().find('.col2').show()
|
||||
});
|
||||
// check for reload changes
|
||||
if(window.self !== window.top) {
|
||||
window.parent.CMS.API.Helpers.reloadBrowser(false, false, true);
|
||||
window.parent.CMS.API.Toolbar.openMessage(that.options.lang.changes, false, 0);
|
||||
}
|
||||
};
|
||||
|
||||
window.moveError = function(node,message){
|
||||
if(message && message !== 'error') {
|
||||
msg = $('<span class="success">'+message+'</span>');
|
||||
}
|
||||
else {
|
||||
msg = $('<span class="success">'+that.options.lang.error+'</span>');
|
||||
}
|
||||
node.parent().find('.col2').hide();
|
||||
node.after(msg);
|
||||
};
|
||||
|
||||
},
|
||||
|
||||
setupTree: function () {
|
||||
var that = this;
|
||||
var tree;
|
||||
// global initTree function
|
||||
initTree = function(){
|
||||
tree = new tree_component();
|
||||
var options = {
|
||||
rules: {
|
||||
clickable: "all",
|
||||
renameable: "none",
|
||||
deletable: "all",
|
||||
creatable: "all",
|
||||
draggable: "all",
|
||||
dragrules: "all",
|
||||
droppable: "all",
|
||||
metadata : "mdata",
|
||||
use_inline: true
|
||||
//droppable : ["tree_drop"]
|
||||
},
|
||||
path: false,
|
||||
ui: {
|
||||
dots: true,
|
||||
rtl: false,
|
||||
animation: 0,
|
||||
hover_mode: true,
|
||||
//theme_path: script_url_path() + "/../jstree/themes/",
|
||||
a_class: "title"
|
||||
},
|
||||
cookies : {
|
||||
prefix: "djangocms_nodes"
|
||||
},
|
||||
callback: {
|
||||
beforemove : function(what, where, position) {
|
||||
item_id = what.id.split("page_")[1];
|
||||
target_id = where.id.split("page_")[1];
|
||||
old_node = what;
|
||||
|
||||
if($(what).parent().children("li").length > 1){
|
||||
if($(what).next("li").length){
|
||||
old_target = $(what).next("li")[0];
|
||||
old_position = "right";
|
||||
}
|
||||
if($(what).prev("li").length){
|
||||
old_target = $(what).prev("li")[0];
|
||||
old_position = "left";
|
||||
}
|
||||
}else{
|
||||
if($(what).attr("rel") != "topnode"){
|
||||
old_target = $(what).parent().parent()[0];
|
||||
old_position = "inside";
|
||||
}
|
||||
}
|
||||
|
||||
addUndo(what, where, position);
|
||||
return true;
|
||||
},
|
||||
onmove: function(what, where, position){
|
||||
item_id = what.id.split("page_")[1];
|
||||
target_id = where.id.split("page_")[1];
|
||||
|
||||
if (position == "before") {
|
||||
position = "left";
|
||||
}else if (position == "after") {
|
||||
position = "right";
|
||||
}else if(position == "inside"){
|
||||
position = "last-child";
|
||||
}
|
||||
moveTreeItem(what, item_id, target_id, position, false);
|
||||
},
|
||||
|
||||
onload: function () {
|
||||
setTimeout(function () {
|
||||
reCalc();
|
||||
}, 250);
|
||||
}
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
if (!$($("div.tree").get(0)).hasClass('root_allow_children')){
|
||||
// disalow possibility for adding subnodes to main tree, user doesn't
|
||||
// have permissions for this
|
||||
options.rules.dragrules = ["node inside topnode", "topnode inside topnode", "node * node"];
|
||||
}
|
||||
|
||||
tree.init($("div.tree"), options);
|
||||
};
|
||||
|
||||
selected_page = false;
|
||||
action = false;
|
||||
|
||||
var _oldAjax = $.ajax;
|
||||
|
||||
$.ajax = function(s){
|
||||
// just override ajax function, so the loader message gets displayed
|
||||
// always
|
||||
$('#loader-message').show();
|
||||
|
||||
callback = s.success || false;
|
||||
s.success = function(data, status){
|
||||
if (callback) {
|
||||
callback(data, status);
|
||||
}
|
||||
$('#loader-message').hide();
|
||||
};
|
||||
|
||||
// just for debuging!!
|
||||
/*s.complete = function(xhr, status) {
|
||||
if (status == "error" && that.options.settings.debug) {
|
||||
$('body').before(xhr.responseText);
|
||||
}
|
||||
}*/
|
||||
// end just for debuging
|
||||
|
||||
// TODO: add error state!
|
||||
return _oldAjax(s);
|
||||
};
|
||||
|
||||
function refresh(){
|
||||
window.location = window.location.href;
|
||||
}
|
||||
|
||||
function refreshIfChildren(pageId){
|
||||
return $('#page_' + pageId).find('li[id^=page_]').length ? refresh : function(){ return true; };
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads remote dialog to dialogs div.
|
||||
*
|
||||
* @param {String} url
|
||||
* @param {Object} data Data to be send over post
|
||||
* @param {Function} noDialogCallback Gets called when response is empty.
|
||||
* @param {Function} callback Standard callback function.
|
||||
*/
|
||||
function loadDialog(url, data, noDialogCallback, callback){
|
||||
if (data === undefined) data = {};
|
||||
$.post(url, data, function(response) {
|
||||
if (response == '' && noDialogCallback) noDialogCallback();
|
||||
$('#dialogs').empty().append(response);
|
||||
if (callback) callback(response);
|
||||
});
|
||||
}
|
||||
|
||||
// let's start event delegation
|
||||
$('#changelist li').click(function(e) {
|
||||
// I want a link to check the class
|
||||
if(e.target.tagName == 'IMG' || e.target.tagName == 'SPAN') {
|
||||
target = e.target.parentNode;
|
||||
} else {
|
||||
target = e.target;
|
||||
}
|
||||
var jtarget = $(target);
|
||||
if(jtarget.hasClass("move")) {
|
||||
// prepare tree for move / cut paste
|
||||
var id = e.target.id.split("move-link-")[1];
|
||||
if(id==null){
|
||||
id = e.target.parentNode.id.split("move-link-")[1];
|
||||
}
|
||||
var page_id = id;
|
||||
selected_page = page_id;
|
||||
action = "move";
|
||||
$('span.move-target-container, span.line, a.move-target').show();
|
||||
$('#page_'+page_id).addClass("selected");
|
||||
$('#page_'+page_id+' span.move-target-container').hide();
|
||||
e.stopPropagation();
|
||||
return false;
|
||||
}
|
||||
|
||||
if(jtarget.hasClass("copy")) {
|
||||
// prepare tree for copy
|
||||
id = e.target.id.split("copy-link-")[1];
|
||||
if(id==null){
|
||||
id = e.target.parentNode.id.split("copy-link-")[1];
|
||||
}
|
||||
selected_page = id;
|
||||
action = mark_copy_node(id);
|
||||
e.stopPropagation();
|
||||
return false;
|
||||
}
|
||||
|
||||
if(jtarget.hasClass("viewpage")) {
|
||||
var view_page_url = $('#' + target.id + '-select').val();
|
||||
if(view_page_url){
|
||||
window.open(view_page_url);
|
||||
}
|
||||
}
|
||||
|
||||
if(jtarget.hasClass("addlink")) {
|
||||
if (!/#$/g.test(jtarget.attr('href'))) {
|
||||
// if there is url instead of # inside href, follow this url
|
||||
// used if user haves add_page
|
||||
return true;
|
||||
}
|
||||
|
||||
$("tr").removeClass("target");
|
||||
$("#changelist table").removeClass("table-selected");
|
||||
page_id = target.id.split("add-link-")[1];
|
||||
selected_page = page_id;
|
||||
action = "add";
|
||||
$('tr').removeClass("selected");
|
||||
$('#page-row-'+page_id).addClass("selected");
|
||||
$('.move-target-container').hide();
|
||||
$('a.move-target, span.line, #move-target-'+page_id).show();
|
||||
e.stopPropagation();
|
||||
return false;
|
||||
}
|
||||
|
||||
// don't assume admin site is root-level
|
||||
// grab base url to construct full absolute URLs
|
||||
admin_base_url = document.URL.split("/cms/page/")[0] + "/";
|
||||
|
||||
// in navigation
|
||||
if(jtarget.hasClass('navigation-checkbox')) {
|
||||
e.stopPropagation();
|
||||
|
||||
var pageId = jtarget.attr('name').split('navigation-')[1];
|
||||
var language = jtarget.closest('.cont').find('a[lang]').attr('lang') || '';
|
||||
|
||||
// if I don't put data in the post, django doesn't get it
|
||||
reloadItem(jtarget, admin_base_url + 'cms/page/' + pageId + '/change-navigation/?language=' + language, { 1:1 });
|
||||
}
|
||||
|
||||
// lazy load descendants on tree open
|
||||
if(jtarget.hasClass("closed")) {
|
||||
// only load them once
|
||||
if(jtarget.find('ul > li').length == 0 && !jtarget.hasClass("loading")) {
|
||||
// keeps this event from firing multiple times before
|
||||
// the dom as changed. it still needs to propagate for
|
||||
// the other click event on this element to fire
|
||||
jtarget.addClass("loading");
|
||||
var pageId = $(jtarget).attr("id").split("page_")[1];
|
||||
var language = $(jtarget).children('div.cont').children('div.col1').children('.title').attr('lang')
|
||||
$.get(admin_base_url + "cms/page/" + pageId + "/" + language + "/descendants/", {}, function(r, status) {
|
||||
jtarget.children('ul').append(r);
|
||||
// show move targets if needed
|
||||
if($('span.move-target-container:visible').length > 0) {
|
||||
jtarget.children('ul').find('a.move-target, span.move-target-container, span.line').show();
|
||||
}
|
||||
reCalc();
|
||||
});
|
||||
} else{
|
||||
reCalc();
|
||||
}
|
||||
}
|
||||
|
||||
if(jtarget.hasClass("move-target")) {
|
||||
if(jtarget.hasClass("left")){
|
||||
position = "left";
|
||||
}
|
||||
if(jtarget.hasClass("right")){
|
||||
position = "right";
|
||||
}
|
||||
if(jtarget.hasClass("last-child")){
|
||||
position = "last-child";
|
||||
}
|
||||
target_id = target.parentNode.id.split("move-target-")[1];
|
||||
|
||||
if(action=="move") {
|
||||
moveTreeItem(null, selected_page, target_id, position, tree);
|
||||
$('.move-target-container').hide();
|
||||
}else if(action=="copy") {
|
||||
site = $('#site-select')[0].value;
|
||||
copyTreeItem(selected_page, target_id, position, site);
|
||||
$('.move-target-container').hide();
|
||||
}else if(action=="add") {
|
||||
site = $('#site-select')[0].value;
|
||||
window.location.href = window.location.href.split("?")[0].split("#")[0] + 'add/?target='+target_id+"&position="+position+"&site="+site;
|
||||
}
|
||||
e.stopPropagation();
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
});
|
||||
$("div#sitemap").show();
|
||||
|
||||
function reCalc(){
|
||||
$.syncCols();
|
||||
}
|
||||
|
||||
$(window).bind('resize', reCalc);
|
||||
/* Site Selector */
|
||||
$('#site-select').change(function(){
|
||||
var form = $(this).closest('form');
|
||||
// add correct value for copy
|
||||
if(action === 'copy') $('#site-copy').val(selected_page);
|
||||
// submit form
|
||||
form.submit();
|
||||
});
|
||||
|
||||
//
|
||||
// If an A element has a data-attribute 'alt-class'. At this time,
|
||||
// this is only the edit button in the page-tree, but could be
|
||||
// more in future. It is important that the CSS be written in such
|
||||
// a manner that the alt-class is defined after the normal class,
|
||||
// so that it can be overridden when the alt-key is depressed.
|
||||
//
|
||||
// NOTE: This 'preview' part of the 'alt-click to [alternative
|
||||
// function]' feature may not work in some environments (Windows
|
||||
// in a some virtual machine environments, notably), but is only a
|
||||
// nice-'extra', not a requirement for the feature.
|
||||
//
|
||||
$(document).on('keydown keyup', function(evt){
|
||||
if (evt.which === 18) {
|
||||
$('a[data-alt-class]').each(function(){
|
||||
var self = $(this);
|
||||
self.toggleClass(self.data('alt-class'), evt.type === 'keydown');
|
||||
})
|
||||
}
|
||||
});
|
||||
|
||||
//
|
||||
// If the A-element has a data-attribute 'alt-href', then this
|
||||
// click-handler uses that instead of the normal href attribute as
|
||||
// the click-destination. Again, currently this is only on the
|
||||
// edit button, but could be more in future.
|
||||
//
|
||||
$('a[data-alt-href]').on('click', function(evt){
|
||||
var href;
|
||||
evt.preventDefault();
|
||||
if (evt.shiftKey) {
|
||||
href = $(this).data('alt-href');
|
||||
}
|
||||
else {
|
||||
href = $(this).attr('href');
|
||||
}
|
||||
window.location = href;
|
||||
});
|
||||
|
||||
var copy_splits = window.location.href.split("copy=");
|
||||
if(copy_splits.length > 1){
|
||||
var id = copy_splits[1].split("&")[0];
|
||||
var action = mark_copy_node(id);
|
||||
selected_page = id;
|
||||
}
|
||||
|
||||
function copyTreeItem(item_id, target_id, position, site){
|
||||
if (that.options.settings.permission) {
|
||||
return loadDialog('./' + item_id + '/dialog/copy/', {
|
||||
position:position,
|
||||
target:target_id,
|
||||
site:site,
|
||||
callback: $.callbackRegister("_copyTreeItem", _copyTreeItem, item_id, target_id, position, site)
|
||||
});
|
||||
}
|
||||
return _copyTreeItem(item_id, target_id, position, site);
|
||||
}
|
||||
|
||||
function _copyTreeItem(item_id, target_id, position, site, options) {
|
||||
var data = {
|
||||
position:position,
|
||||
target:target_id,
|
||||
site:site
|
||||
};
|
||||
data = $.extend(data, options);
|
||||
|
||||
$.post("./" + item_id + "/copy-page/", data, function(decoded) {
|
||||
response = decoded.content;
|
||||
status = decoded.status;
|
||||
if(status==200) {
|
||||
// reload tree
|
||||
window.location = window.location.href;
|
||||
}else{
|
||||
alert(response);
|
||||
moveError($('#page_'+item_id + " div.col1:eq(0)"),response);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function mark_copy_node(id){
|
||||
$('a.move-target, span.move-target-container, span.line').show();
|
||||
$('#page_'+id).addClass("selected");
|
||||
$('#page_'+id).parent().parent().children('div.cont').find('a.move-target.first-child, span.second').hide();
|
||||
$('#page_'+id).parent().parent().children('ul').children('li').children('div.cont').find('a.move-target.left, a.move-target.right, span.first, span.second').hide();
|
||||
return "copy";
|
||||
}
|
||||
|
||||
/**
|
||||
* Reloads tree item (one line). If some filtering is found, adds
|
||||
* filtered variable into posted data.
|
||||
*
|
||||
* @param {HTMLElement} el Any child element of tree item
|
||||
* @param {String} url Requested url
|
||||
* @param {Object} data Optional posted data
|
||||
* @param {Function} callback Optional calback function
|
||||
*/
|
||||
function reloadItem(el, url, data, callback, errorCallback) {
|
||||
if (data === undefined) data = {};
|
||||
|
||||
if (/\/\?/ig.test(window.location.href)) {
|
||||
// probably some filter here, tell backend, we need a filtered
|
||||
// version of item
|
||||
data['fitlered'] = 1;
|
||||
}
|
||||
|
||||
function onSuccess(response, textStatus) {
|
||||
var status = true;
|
||||
var target = null;
|
||||
|
||||
if(callback) status = callback(response, textStatus);
|
||||
if(status) {
|
||||
if (/page_\d+/.test($(el).attr('id'))) {
|
||||
// one level higher
|
||||
target = $(el).find('div.cont:first');
|
||||
} else {
|
||||
target = $(el).parents('div.cont:first');
|
||||
}
|
||||
|
||||
var parent = target.parent();
|
||||
|
||||
// remove the element if something went wrong
|
||||
if(response == 'NotFound') return parent.remove();
|
||||
|
||||
var origin = $('.messagelist');
|
||||
target.replace(response);
|
||||
|
||||
var messages = $(parent).find('.messagelist');
|
||||
if(messages.length) {
|
||||
origin.remove();
|
||||
messages.insertAfter('.breadcrumbs');
|
||||
}
|
||||
parent.find('div.cont:first').yft();
|
||||
|
||||
// ensure after removal everything is aligned again
|
||||
$(window).trigger('resize');
|
||||
}
|
||||
}
|
||||
|
||||
$.ajax({
|
||||
'type': 'POST',
|
||||
'data': data,
|
||||
'url': url,
|
||||
'success': onSuccess,
|
||||
'error': function (XMLHttpRequest, textStatus, errorThrown) {
|
||||
// errorCallback is passed through the reloadItem function
|
||||
if(errorCallback) errorCallback(XMLHttpRequest, textStatus, errorThrown);
|
||||
},
|
||||
'xhr': (window.ActiveXObject) ? function(){try {return new window.ActiveXObject("Microsoft.XMLHTTP");} catch(e) {}} : function() {return new window.XMLHttpRequest();}
|
||||
});
|
||||
}
|
||||
|
||||
function moveTreeItem(jtarget, item_id, target_id, position, tree){
|
||||
reloadItem(
|
||||
jtarget, "./" + item_id + "/move-page/",
|
||||
|
||||
{ position: position, target: target_id },
|
||||
|
||||
// on success
|
||||
function(decoded,textStatus){
|
||||
response = decoded.content;
|
||||
status = decoded.status;
|
||||
if(status==200) {
|
||||
if (tree) {
|
||||
var tree_pos = {'left': 'before', 'right': 'after'}[position] || 'inside';
|
||||
tree.moved("#page_" + item_id, $("#page_" + target_id + " a.title")[0], tree_pos, false, false);
|
||||
} else {
|
||||
moveSuccess($('#page_'+item_id + " div.col1:eq(0)"));
|
||||
}
|
||||
return false;
|
||||
}
|
||||
else {
|
||||
moveError($('#page_'+item_id + " div.col1:eq(0)"),response);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
var undos = [];
|
||||
|
||||
function addUndo(node, target, position){
|
||||
undos.push({node:node, target:target, position:position});
|
||||
}
|
||||
},
|
||||
|
||||
refreshColumns: function () {
|
||||
$('div.col2').children('div').each(function(index, item){
|
||||
$(item).css('display', 'block');
|
||||
});
|
||||
var min_width = 100000;
|
||||
var max_col2_width = 0;
|
||||
var max_col2 = null;
|
||||
$(this).each(function() {
|
||||
var cont = $(this).children('div.cont');
|
||||
if (!cont.is(':visible')) {
|
||||
return;
|
||||
}
|
||||
var col1 = cont.children('div.col1');
|
||||
var col2 = cont.children('div.col2');
|
||||
var col1_width = col1.outerWidth(true);
|
||||
var col2_width = col2.outerWidth(true);
|
||||
var total_width = cont.outerWidth(true);
|
||||
|
||||
var dif = total_width - col1_width;
|
||||
if(dif < min_width){
|
||||
min_width = dif;
|
||||
}
|
||||
if(col2_width > max_col2_width){
|
||||
max_col2_width = col2_width;
|
||||
max_col2 = col2
|
||||
}
|
||||
});
|
||||
|
||||
var offset = 50;
|
||||
var w = 0;
|
||||
var hidden_count = 0;
|
||||
var max_reached = false;
|
||||
if(max_col2){
|
||||
max_col2.children('div').each(function(){
|
||||
if(!max_reached){
|
||||
w += $(this).outerWidth(true);
|
||||
}
|
||||
|
||||
if(max_reached || w > (min_width - offset)){
|
||||
hidden_count = hidden_count + 1;
|
||||
max_reached = true
|
||||
}
|
||||
});
|
||||
|
||||
if(hidden_count){
|
||||
$(this).each(function() {
|
||||
$(this).children('div.cont').children('div.col2').children('div').slice(-hidden_count).each(function(){
|
||||
$(this).css('display', 'none');
|
||||
})
|
||||
});
|
||||
$('div#sitemap ul.header div.col2').children().slice(-hidden_count).each(function(){
|
||||
$(this).css('display','none');
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
});
|
||||
})(CMS.$);
|
||||
107
static/cms/js/modules/cms.clipboard.js
Normal file
|
|
@ -0,0 +1,107 @@
|
|||
/*##################################################|*/
|
||||
/* #CMS# */
|
||||
(function($) {
|
||||
// CMS.$ will be passed for $
|
||||
$(document).ready(function () {
|
||||
/*!
|
||||
* Clipboard
|
||||
* Handles copy & paste
|
||||
*/
|
||||
CMS.Clipboard = new CMS.Class({
|
||||
|
||||
implement: [CMS.API.Helpers],
|
||||
|
||||
options: {
|
||||
'position': 220, // offset to top
|
||||
'speed': 100,
|
||||
'id': null,
|
||||
'url': ''
|
||||
},
|
||||
|
||||
initialize: function (options) {
|
||||
this.clipboard = $('.cms_clipboard');
|
||||
this.options = $.extend(true, {}, this.options, options);
|
||||
this.config = CMS.config;
|
||||
this.settings = CMS.settings;
|
||||
|
||||
// elements
|
||||
this.containers = this.clipboard.find('.cms_clipboard-containers > .cms_draggable');
|
||||
this.triggers = this.clipboard.find('.cms_clipboard-triggers a');
|
||||
this.triggerRemove = this.clipboard.find('.cms_clipboard-empty a');
|
||||
|
||||
// states
|
||||
this.click = (document.ontouchstart !== null) ? 'click.cms' : 'touchend.cms click.cms';
|
||||
this.timer = function () {};
|
||||
|
||||
// setup initial stuff
|
||||
this._setup();
|
||||
|
||||
// setup events
|
||||
this._events();
|
||||
},
|
||||
|
||||
// initial methods
|
||||
_setup: function () {
|
||||
var that = this;
|
||||
|
||||
// attach visual events
|
||||
this.triggers.bind('mouseenter mouseleave', function (e) {
|
||||
e.preventDefault();
|
||||
// clear timeout
|
||||
clearTimeout(that.timer);
|
||||
|
||||
if(e.type === 'mouseleave' && !that.containers.has(e.toElement).length) hide();
|
||||
|
||||
var index = that.clipboard.find('.cms_clipboard-triggers a').index(this);
|
||||
var el = that.containers.eq(index);
|
||||
// cancel if element is already open
|
||||
if(el.data('open') === true) return false;
|
||||
|
||||
// show element
|
||||
that.containers.stop().css({ 'margin-left': -that.options.position }).data('open', false);
|
||||
el.stop().animate({ 'margin-left': 0 }, that.options.speed);
|
||||
el.data('open', true);
|
||||
});
|
||||
that.containers.bind('mouseover mouseleave', function (e) {
|
||||
// clear timeout
|
||||
clearTimeout(that.timer);
|
||||
|
||||
// cancel if we trigger mouseover
|
||||
if(e.type === 'mouseover') return false;
|
||||
|
||||
// we need a little timer to detect if we should hide the menu
|
||||
hide();
|
||||
});
|
||||
|
||||
function hide() {
|
||||
that.timer = setTimeout(function () {
|
||||
that.containers.stop().css({ 'margin-left': -that.options.position }).data('open', false);
|
||||
}, that.options.speed);
|
||||
}
|
||||
},
|
||||
|
||||
_events: function () {
|
||||
var that = this;
|
||||
|
||||
// add remove event
|
||||
this.triggerRemove.bind(this.click, function (e) {
|
||||
e.preventDefault();
|
||||
that.clear(function () {
|
||||
// remove element on success
|
||||
that.clipboard.hide();
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
// public methods
|
||||
clear: function (callback) {
|
||||
// post needs to be a string, it will be converted using JSON.parse
|
||||
var post = '{ "csrfmiddlewaretoken": "' + this.config.csrf + '" }';
|
||||
// redirect to ajax
|
||||
CMS.API.Toolbar.openAjax(this.config.clipboard.url, post, '', callback);
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
});
|
||||
})(CMS.$);
|
||||
638
static/cms/js/modules/cms.modal.js
Normal file
|
|
@ -0,0 +1,638 @@
|
|||
/*##################################################|*/
|
||||
/* #CMS# */
|
||||
(function($) {
|
||||
// CMS.$ will be passed for $
|
||||
$(document).ready(function () {
|
||||
/*!
|
||||
* Modal
|
||||
* Controls a cms specific modal
|
||||
*/
|
||||
CMS.Modal = new CMS.Class({
|
||||
|
||||
implement: [CMS.API.Helpers],
|
||||
|
||||
options: {
|
||||
'onClose': false,
|
||||
'minHeight': 400,
|
||||
'minWidth': 800,
|
||||
'modalDuration': 300,
|
||||
'newPlugin': false,
|
||||
'urls': {
|
||||
'css_modal': 'cms/css/cms.toolbar.modal.css'
|
||||
}
|
||||
},
|
||||
|
||||
initialize: function (options) {
|
||||
this.options = $.extend(true, {}, this.options, options);
|
||||
this.config = CMS.config;
|
||||
|
||||
// elements
|
||||
this.body = $('html');
|
||||
this.modal = $('.cms_modal');
|
||||
this.toolbar = $('.cms_toolbar');
|
||||
|
||||
// states
|
||||
this.click = (document.ontouchstart !== null) ? 'click.cms' : 'touchend.cms click.cms';
|
||||
this.maximized = false;
|
||||
this.minimized = false;
|
||||
this.triggerMaximized = false;
|
||||
this.saved = false;
|
||||
|
||||
// if the modal is initialized the first time, set the events
|
||||
if(!this.modal.data('ready')) this._events();
|
||||
|
||||
// ready modal
|
||||
this.modal.data('ready', true);
|
||||
},
|
||||
|
||||
// initial methods
|
||||
_events: function () {
|
||||
var that = this;
|
||||
|
||||
// attach events to window
|
||||
this.modal.find('.cms_modal-collapse').bind(this.click, function (e) {
|
||||
e.preventDefault();
|
||||
that._minimize();
|
||||
});
|
||||
this.modal.find('.cms_modal-title').bind('mousedown.cms', function (e) {
|
||||
e.preventDefault();
|
||||
that._startMove(e);
|
||||
});
|
||||
this.modal.find('.cms_modal-title').bind('dblclick.cms', function () {
|
||||
that._maximize();
|
||||
});
|
||||
this.modal.find('.cms_modal-resize').bind('mousedown.cms', function (e) {
|
||||
e.preventDefault();
|
||||
that._startResize(e);
|
||||
});
|
||||
this.modal.find('.cms_modal-maximize').bind(this.click, function (e) {
|
||||
e.preventDefault();
|
||||
that._maximize();
|
||||
});
|
||||
this.modal.find('.cms_modal-breadcrumb-items').on(this.click, 'a', function (e) {
|
||||
e.preventDefault();
|
||||
that._changeContent($(this));
|
||||
});
|
||||
this.modal.find('.cms_modal-close, .cms_modal-cancel').bind(this.click, function (e) {
|
||||
that.options.onClose = null;
|
||||
e.preventDefault();
|
||||
that.close();
|
||||
});
|
||||
|
||||
// stopper events
|
||||
$(document).bind('mouseup.cms', function (e) {
|
||||
that._endMove(e);
|
||||
that._endResize(e);
|
||||
});
|
||||
},
|
||||
|
||||
// public methods
|
||||
open: function (url, name, breadcrumb) {
|
||||
// cancel if another lightbox is already being opened
|
||||
if(CMS.API.locked) {
|
||||
CMS.API.locked = false;
|
||||
return false
|
||||
} else {
|
||||
CMS.API.locked = true;
|
||||
}
|
||||
|
||||
// because a new instance is called, we have to ensure minimized state is removed #3620
|
||||
if(this.modal.is(':visible') && this.modal.find('.cms_modal-collapsed').length) {
|
||||
this.minimized = true;
|
||||
this._minimize();
|
||||
}
|
||||
|
||||
// show loader
|
||||
CMS.API.Toolbar._loader(true);
|
||||
|
||||
// hide tooltip
|
||||
this.hideTooltip();
|
||||
|
||||
// reset breadcrumb
|
||||
this.modal.find('.cms_modal-breadcrumb').hide();
|
||||
this.modal.find('.cms_modal-breadcrumb-items').html('');
|
||||
|
||||
// empty buttons
|
||||
this.modal.find('.cms_modal-buttons').html('');
|
||||
|
||||
var contents = this.modal.find('.cms_modal-body, .cms_modal-foot');
|
||||
contents.show();
|
||||
|
||||
this._loadContent(url, name);
|
||||
|
||||
// insure modal is not maximized
|
||||
if(this.modal.find('.cms_modal-collapsed').length) this._minimize();
|
||||
|
||||
// reset styles
|
||||
this.modal.css({
|
||||
'left': '50%',
|
||||
'top': '50%',
|
||||
'mergin-left': 0,
|
||||
'margin-right': 0
|
||||
});
|
||||
// lets set the modal width and height to the size of the browser
|
||||
var widthOffset = 300; // adds margin left and right
|
||||
var heightOffset = 350; // adds margin top and bottom;
|
||||
var screenWidth = $(window).width(); // it has to be the height of the window not computer screen
|
||||
var screenHeight = $(window).height(); // it has to be the height of the window and not computer screen
|
||||
|
||||
var width = (screenWidth >= this.options.minWidth + widthOffset) ? screenWidth - widthOffset : this.options.minWidth;
|
||||
var height = (screenHeight >= this.options.minHeight + heightOffset) ? screenHeight - heightOffset : this.options.minHeight;
|
||||
this.modal.find('.cms_modal-body').css({
|
||||
'width': width,
|
||||
'height': height
|
||||
});
|
||||
this.modal.find('.cms_modal-body').removeClass('cms_loader');
|
||||
this.modal.find('.cms_modal-maximize').removeClass('cms_modal-maximize-active');
|
||||
this.maximized = false;
|
||||
// in case, the window is larger than the windows height, we trigger fullscreen mode
|
||||
if(height >= screenHeight) this.triggerMaximized = true;
|
||||
|
||||
// we need to render the breadcrumb
|
||||
this._setBreadcrumb(breadcrumb);
|
||||
|
||||
// display modal
|
||||
this._show(this.options.modalDuration);
|
||||
},
|
||||
|
||||
close: function () {
|
||||
var that = this;
|
||||
// handle remove option when plugin is new
|
||||
if(this.options.newPlugin) {
|
||||
var data = this.options.newPlugin;
|
||||
var post = '{ "csrfmiddlewaretoken": "' + this.config.csrf + '" }';
|
||||
var text = this.config.lang.confirm;
|
||||
|
||||
// trigger an ajax request
|
||||
CMS.API.Toolbar.openAjax(data['delete'], post, text, function () {
|
||||
that._hide(100);
|
||||
});
|
||||
} else {
|
||||
this._hide(100);
|
||||
}
|
||||
|
||||
// handle refresh option
|
||||
if(this.options.onClose) this.reloadBrowser(this.options.onClose, false, true);
|
||||
|
||||
// reset maximize or minimize states for #3111
|
||||
setTimeout(function () {
|
||||
if(that.minimized) { that._minimize(); }
|
||||
if(that.maximized) { that._maximize(); }
|
||||
}, 300);
|
||||
},
|
||||
|
||||
// private methods
|
||||
_show: function (speed) {
|
||||
// we need to position the modal in the center
|
||||
var that = this;
|
||||
var width = this.modal.width();
|
||||
var height = this.modal.height();
|
||||
|
||||
// animates and sets the modal
|
||||
this.modal.show().css({
|
||||
'width': 0,
|
||||
'height': 0,
|
||||
'margin-left': 0,
|
||||
'margin-top': 0
|
||||
}).stop(true, true).animate({
|
||||
'width': width,
|
||||
'height': height,
|
||||
'margin-left': -(width / 2),
|
||||
'margin-top': -(height / 2)
|
||||
}, speed, function () {
|
||||
$(this).removeAttr('style');
|
||||
|
||||
that.modal.css({
|
||||
'margin-left': -(width / 2),
|
||||
'margin-top': -(height / 2)
|
||||
});
|
||||
|
||||
// fade in modal window
|
||||
that.modal.show();
|
||||
|
||||
// hide loader
|
||||
CMS.API.Toolbar._loader(false);
|
||||
|
||||
// check if we should maximize
|
||||
if(that.triggerMaximized) that._maximize();
|
||||
|
||||
// changed locked status to allow other modals again
|
||||
CMS.API.locked = false;
|
||||
});
|
||||
|
||||
// add esc close event
|
||||
$(document).bind('keydown.cms', function (e) {
|
||||
if(e.keyCode === 27) that.close();
|
||||
});
|
||||
|
||||
// set focus to modal
|
||||
this.modal.focus();
|
||||
},
|
||||
|
||||
_hide: function (speed) {
|
||||
this.modal.fadeOut(speed);
|
||||
this.modal.find('.cms_modal-frame iframe').remove();
|
||||
this.modal.find('.cms_modal-body').removeClass('cms_loader');
|
||||
},
|
||||
|
||||
_minimize: function () {
|
||||
var trigger = this.modal.find('.cms_modal-collapse');
|
||||
var maximize = this.modal.find('.cms_modal-maximize');
|
||||
var contents = this.modal.find('.cms_modal-body, .cms_modal-foot');
|
||||
var title = this.modal.find('.cms_modal-title');
|
||||
|
||||
// cancel action if maximized
|
||||
if(this.maximized) return false;
|
||||
|
||||
if(this.minimized === false) {
|
||||
// ensure toolbar is shown
|
||||
CMS.API.Toolbar.toggleToolbar(true);
|
||||
|
||||
// minimize
|
||||
trigger.addClass('cms_modal-collapsed');
|
||||
contents.hide();
|
||||
|
||||
// save initial state
|
||||
this.modal.data('css', {
|
||||
'left': this.modal.css('left'),
|
||||
'top': this.modal.css('top'),
|
||||
'margin': this.modal.css('margin')
|
||||
});
|
||||
|
||||
this.modal.css({
|
||||
'left': this.toolbar.find('.cms_toolbar-left').outerWidth(true) + 50,
|
||||
'top': (this.config.debug) ? 6 : 1,
|
||||
'margin': 0
|
||||
});
|
||||
|
||||
// enable scrolling
|
||||
this.body.css('overflow', '');
|
||||
|
||||
// ensure maximize element is hidden #3111
|
||||
maximize.hide();
|
||||
// set correct cursor when maximized #3111
|
||||
title.css('cursor', 'default');
|
||||
|
||||
this.minimized = true;
|
||||
} else {
|
||||
// minimize
|
||||
trigger.removeClass('cms_modal-collapsed');
|
||||
contents.show();
|
||||
|
||||
// reattach css
|
||||
this.modal.css(this.modal.data('css'));
|
||||
|
||||
// disable scrolling
|
||||
this.body.css('overflow', 'hidden');
|
||||
|
||||
// ensure maximize element is shown #3111
|
||||
maximize.show();
|
||||
// set correct cursor when maximized #3111
|
||||
title.css('cursor', 'move');
|
||||
|
||||
this.minimized = false;
|
||||
}
|
||||
},
|
||||
|
||||
_maximize: function () {
|
||||
var debug = (this.config.debug) ? 5 : 0;
|
||||
var container = this.modal.find('.cms_modal-body');
|
||||
var minimize = this.modal.find('.cms_modal-collapse');
|
||||
var trigger = this.modal.find('.cms_modal-maximize');
|
||||
var title = this.modal.find('.cms_modal-title');
|
||||
|
||||
// cancel action when minimized
|
||||
if(this.minimized) return false;
|
||||
|
||||
if(this.maximized === false) {
|
||||
// maximize
|
||||
this.maximized = true;
|
||||
trigger.addClass('cms_modal-maximize-active');
|
||||
|
||||
this.modal.data('css', {
|
||||
'left': this.modal.css('left'),
|
||||
'top': this.modal.css('top'),
|
||||
'margin-left': this.modal.css('margin-left'),
|
||||
'margin-top': this.modal.css('margin-top')
|
||||
});
|
||||
container.data('css', {
|
||||
'width': container.width(),
|
||||
'height': container.height()
|
||||
});
|
||||
|
||||
// reset
|
||||
this.modal.css({
|
||||
'left': 0,
|
||||
'top': debug,
|
||||
'margin': 0
|
||||
});
|
||||
// bind resize event
|
||||
$(window).bind('resize.cms.modal', function () {
|
||||
container.css({
|
||||
'width': $(window).width(),
|
||||
'height': $(window).height() - 60 - debug
|
||||
});
|
||||
});
|
||||
$(window).trigger('resize.cms.modal');
|
||||
|
||||
// ensure maximize element is hidden #3111
|
||||
minimize.hide();
|
||||
// set correct cursor when maximized #3111
|
||||
title.css('cursor', 'default');
|
||||
} else {
|
||||
// minimize
|
||||
this.maximized = false;
|
||||
trigger.removeClass('cms_modal-maximize-active');
|
||||
|
||||
$(window).unbind('resize.cms.modal');
|
||||
|
||||
// reattach css
|
||||
this.modal.css(this.modal.data('css'));
|
||||
container.css(container.data('css'));
|
||||
|
||||
// ensure maximize element is shown #3111
|
||||
minimize.show();
|
||||
// set correct cursor when maximized #3111
|
||||
title.css('cursor', 'move');
|
||||
}
|
||||
},
|
||||
|
||||
_startMove: function (initial) {
|
||||
// cancel if maximized
|
||||
if(this.maximized) return false;
|
||||
// cancel action when minimized
|
||||
if(this.minimized) return false;
|
||||
|
||||
var that = this;
|
||||
var position = that.modal.position();
|
||||
|
||||
this.modal.find('.cms_modal-shim').show();
|
||||
|
||||
$(document).bind('mousemove.cms', function (e) {
|
||||
var left = position.left - (initial.pageX - e.pageX);
|
||||
var top = position.top - (initial.pageY - e.pageY);
|
||||
|
||||
that.modal.css({
|
||||
'left': left,
|
||||
'top': top
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
_endMove: function () {
|
||||
this.modal.find('.cms_modal-shim').hide();
|
||||
|
||||
$(document).unbind('mousemove.cms');
|
||||
},
|
||||
|
||||
_startResize: function (initial) {
|
||||
// cancel if in fullscreen
|
||||
if(this.maximized) return false;
|
||||
// continue
|
||||
var that = this;
|
||||
var container = this.modal.find('.cms_modal-body');
|
||||
var width = container.width();
|
||||
var height = container.height();
|
||||
var modalLeft = this.modal.position().left;
|
||||
var modalTop = this.modal.position().top;
|
||||
|
||||
this.modal.find('.cms_modal-shim').show();
|
||||
|
||||
$(document).bind('mousemove.cms', function (e) {
|
||||
var mvX = initial.pageX - e.pageX;
|
||||
var mvY = initial.pageY - e.pageY;
|
||||
|
||||
var w = width - (mvX * 2);
|
||||
var h = height - (mvY * 2);
|
||||
var max = 680;
|
||||
|
||||
// add some limits
|
||||
if(w <= max || h <= 100) return false;
|
||||
|
||||
// set centered animation
|
||||
container.css({
|
||||
'width': width - (mvX * 2),
|
||||
'height': height - (mvY * 2)
|
||||
});
|
||||
that.modal.css({
|
||||
'left': modalLeft + mvX,
|
||||
'top': modalTop + mvY
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
_endResize: function () {
|
||||
this.modal.find('.cms_modal-shim').hide();
|
||||
|
||||
$(document).unbind('mousemove.cms');
|
||||
},
|
||||
|
||||
_setBreadcrumb: function (breadcrumb) {
|
||||
var bread = this.modal.find('.cms_modal-breadcrumb');
|
||||
var crumb = '';
|
||||
|
||||
// cancel if there is no breadcrumb)
|
||||
if(!breadcrumb || breadcrumb.length <= 0) return false;
|
||||
if(!breadcrumb[0].title) return false;
|
||||
|
||||
// load breadcrumb
|
||||
$.each(breadcrumb, function (index, item) {
|
||||
// check if the item is the last one
|
||||
var last = (index >= breadcrumb.length - 1) ? 'cms_modal-breadcrumb-last' : '';
|
||||
// render breadcrumb
|
||||
crumb += '<a href="' + item.url + '" class="' + last + '"><span>' + item.title + '</span></a>';
|
||||
});
|
||||
|
||||
// attach elements
|
||||
bread.find('.cms_modal-breadcrumb-items').html(crumb);
|
||||
|
||||
// show breadcrumb
|
||||
bread.show();
|
||||
},
|
||||
|
||||
_setButtons: function (iframe) {
|
||||
var djangoSuit = iframe.contents().find('.suit-columns').length > 0;
|
||||
var that = this;
|
||||
var row;
|
||||
if (!djangoSuit) {
|
||||
row = iframe.contents().find('.submit-row:eq(0)');
|
||||
} else {
|
||||
row = iframe.contents().find('.save-box:eq(0)');
|
||||
}
|
||||
// hide all submit-rows
|
||||
iframe.contents().find('.submit-row').hide();
|
||||
var buttons = row.find('input, a, button');
|
||||
var render = $('<span />'); // seriously jquery...
|
||||
|
||||
// if there are no given buttons within the submit-row area
|
||||
// scan deeper within the form itself
|
||||
if(!buttons.length) {
|
||||
row = iframe.contents().find('body:not(.change-list) #content form:eq(0)');
|
||||
buttons = row.find('input[type="submit"], button[type="submit"]');
|
||||
buttons.addClass('deletelink')
|
||||
.hide();
|
||||
}
|
||||
// attach relation id
|
||||
buttons.each(function (index, item) {
|
||||
$(item).attr('data-rel', '_' + index);
|
||||
});
|
||||
|
||||
// loop over input buttons
|
||||
buttons.each(function (index, item) {
|
||||
item = $(item);
|
||||
|
||||
// cancel if item is a hidden input
|
||||
if(item.attr('type') === 'hidden') return false;
|
||||
|
||||
// create helper variables
|
||||
var title = item.attr('value') || item.text();
|
||||
var cls = 'cms_btn';
|
||||
|
||||
// set additional special css classes
|
||||
if(item.hasClass('default')) cls = 'cms_btn cms_btn-action';
|
||||
if(item.hasClass('deletelink')) cls = 'cms_btn cms_btn-caution';
|
||||
|
||||
// create the element and attach events
|
||||
var el = $('<div class="'+cls+' '+item.attr('class')+'">'+title+'</div>');
|
||||
el.bind(that.click, function () {
|
||||
if(item.is('input') || item.is('button')) item[0].click();
|
||||
if(item.is('a')) that._loadContent(item.prop('href'), title);
|
||||
|
||||
// trigger only when blue action buttons are triggered
|
||||
if(item.hasClass('default') || item.hasClass('deletelink')) {
|
||||
that.options.newPlugin = null;
|
||||
// reset onClose when delete is triggered
|
||||
if(item.hasClass('deletelink')) that.options.onClose = null;
|
||||
// hide iframe
|
||||
that.modal.find('.cms_modal-frame iframe').hide();
|
||||
// page has been saved or deleted, run checkup
|
||||
that.saved = true;
|
||||
}
|
||||
});
|
||||
|
||||
// append element
|
||||
render.append(el);
|
||||
});
|
||||
|
||||
// manually add cancel button at the end
|
||||
var cancel = $('<div class="cms_btn">'+that.config.lang.cancel+'</div>');
|
||||
cancel.bind(that.click, function () {
|
||||
that.options.onClose = false;
|
||||
that.close();
|
||||
});
|
||||
render.append(cancel);
|
||||
|
||||
// render buttons
|
||||
this.modal.find('.cms_modal-buttons').html(render);
|
||||
},
|
||||
|
||||
_loadContent: function (url, name) {
|
||||
var that = this;
|
||||
|
||||
// FIXME: A better fix is needed for '&' being interpreted as the
|
||||
// start of en entity by jQuery. See #3404
|
||||
url = url.replace('&', '&');
|
||||
// now refresh the content
|
||||
var iframe = $('<iframe src="'+url+'" class="" frameborder="0" />');
|
||||
iframe.css('visibility', 'hidden');
|
||||
var holder = this.modal.find('.cms_modal-frame');
|
||||
|
||||
// set correct title
|
||||
var title = this.modal.find('.cms_modal-title');
|
||||
title.html(name || ' ');
|
||||
|
||||
// ensure previous iframe is hidden
|
||||
holder.find('iframe').css('visibility', 'hidden');
|
||||
|
||||
// attach load event for iframe to prevent flicker effects
|
||||
iframe.bind('load', function () {
|
||||
// check if iframe can be accessed
|
||||
try {
|
||||
iframe.contents();
|
||||
} catch (error) {
|
||||
CMS.API.Toolbar.showError('<strong>' + error + '</strong>');
|
||||
that.close();
|
||||
}
|
||||
|
||||
// show messages in toolbar if provided
|
||||
var messages = iframe.contents().find('.messagelist li');
|
||||
if(messages.length) CMS.API.Toolbar.openMessage(messages.eq(0).text());
|
||||
messages.remove();
|
||||
var contents = iframe.contents();
|
||||
|
||||
// determine if we should close the modal or reload
|
||||
if(messages.length && that.enforceReload) that.reloadBrowser();
|
||||
if(messages.length && that.enforceClose) {
|
||||
that.close();
|
||||
return false;
|
||||
}
|
||||
|
||||
// after iframe is loaded append css
|
||||
contents.find('head').append($('<link rel="stylesheet" type="text/css" href="' + that.config.urls.static + that.options.urls.css_modal + '" />'));
|
||||
|
||||
// adding django hacks
|
||||
contents.find('.viewsitelink').attr('target', '_top');
|
||||
|
||||
// set modal buttons
|
||||
that._setButtons($(this));
|
||||
|
||||
// when an error occurs, reset the saved status so the form can be checked and validated again
|
||||
if(iframe.contents().find('.errornote').length || iframe.contents().find('.errorlist').length) {
|
||||
that.saved = false;
|
||||
}
|
||||
|
||||
// when the window has been changed pressing the blue or red button, we need to run a reload check
|
||||
// also check that no delete-confirmation is required
|
||||
if(that.saved && !contents.find('.delete-confirmation').length) {
|
||||
that.reloadBrowser(window.location.href, false, true);
|
||||
} else {
|
||||
iframe.show();
|
||||
// set title of not provided
|
||||
var innerTitle = iframe.contents().find('#content h1:eq(0)');
|
||||
if(name === undefined) title.html(innerTitle.text());
|
||||
innerTitle.remove();
|
||||
|
||||
// than show
|
||||
iframe.css('visibility', 'visible');
|
||||
|
||||
// append ready state
|
||||
iframe.data('ready', true);
|
||||
|
||||
// attach close event
|
||||
contents.find('body').bind('keydown.cms', function (e) {
|
||||
if(e.keyCode === 27) that.close();
|
||||
});
|
||||
contents.find('body').addClass('cms_modal-window');
|
||||
|
||||
// figure out if .object-tools is available
|
||||
if(contents.find('.object-tools').length) {
|
||||
contents.find('#content').css('padding-top', 38);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// inject
|
||||
setTimeout(function () {
|
||||
that.modal.find('.cms_modal-body').addClass('cms_loader');
|
||||
holder.html(iframe);
|
||||
}, this.options.modalDuration);
|
||||
},
|
||||
|
||||
_changeContent: function (el) {
|
||||
if(el.hasClass('cms_modal-breadcrumb-last')) return false;
|
||||
|
||||
var parents = el.parent().find('a');
|
||||
parents.removeClass('cms_modal-breadcrumb-last');
|
||||
|
||||
el.addClass('cms_modal-breadcrumb-last');
|
||||
|
||||
this._loadContent(el.attr('href'));
|
||||
|
||||
// update title
|
||||
this.modal.find('.cms_modal-title').text(el.text());
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
});
|
||||
})(CMS.$);
|
||||
775
static/cms/js/modules/cms.plugins.js
Normal file
|
|
@ -0,0 +1,775 @@
|
|||
/*##################################################|*/
|
||||
/* #CMS# */
|
||||
(function($) {
|
||||
// CMS.$ will be passed for $
|
||||
$(document).ready(function () {
|
||||
/*!
|
||||
* Plugins
|
||||
* for created plugins or generics (static content)
|
||||
*/
|
||||
CMS.Plugin = new CMS.Class({
|
||||
|
||||
implement: [CMS.API.Helpers],
|
||||
|
||||
options: {
|
||||
'type': '', // bar, plugin or generic
|
||||
'placeholder_id': null,
|
||||
'plugin_type': '',
|
||||
'plugin_id': null,
|
||||
'plugin_language': '',
|
||||
'plugin_parent': null,
|
||||
'plugin_order': null,
|
||||
'plugin_breadcrumb': [],
|
||||
'plugin_restriction': [],
|
||||
'urls': {
|
||||
'add_plugin': '',
|
||||
'edit_plugin': '',
|
||||
'move_plugin': '',
|
||||
'copy_plugin': '',
|
||||
'delete_plugin': ''
|
||||
}
|
||||
},
|
||||
|
||||
initialize: function (container, options) {
|
||||
this.container = $('.' + container);
|
||||
this.options = $.extend(true, {}, this.options, options);
|
||||
|
||||
// elements
|
||||
this.body = $(document);
|
||||
|
||||
// states
|
||||
this.csrf = CMS.config.csrf;
|
||||
this.timer = function () {};
|
||||
this.timeout = 250;
|
||||
this.focused = false;
|
||||
this.click = (document.ontouchstart !== null) ? 'click.cms' : 'tap.cms click.cms';
|
||||
|
||||
// bind data element to the container
|
||||
this.container.data('settings', this.options);
|
||||
|
||||
// determine type of plugin
|
||||
switch(this.options.type) {
|
||||
case 'placeholder': // handler for placeholder bars
|
||||
this._setPlaceholder();
|
||||
this._collapsables();
|
||||
break;
|
||||
case 'plugin': // handler for all plugins
|
||||
this._setPlugin();
|
||||
this._collapsables();
|
||||
break;
|
||||
default: // handler for static content
|
||||
this._setGeneric();
|
||||
}
|
||||
},
|
||||
|
||||
// initial methods
|
||||
_setPlaceholder: function () {
|
||||
var that = this;
|
||||
var title = '.cms_dragbar-title';
|
||||
var expanded = 'cms_dragbar-title-expanded';
|
||||
var dragbar = $('.cms_dragbar-' + this.options.placeholder_id);
|
||||
|
||||
// register the subnav on the placeholder
|
||||
this._setSubnav(dragbar.find('.cms_submenu'));
|
||||
|
||||
// enable expanding/collapsing globally within the placeholder
|
||||
dragbar.find(title).bind(this.click, function () {
|
||||
($(this).hasClass(expanded)) ? that._collapseAll($(this)) : that._expandAll($(this));
|
||||
});
|
||||
},
|
||||
|
||||
_setPlugin: function () {
|
||||
var that = this;
|
||||
var timer = function () {};
|
||||
|
||||
// adds double click to edit
|
||||
this.container.bind('dblclick', function (e) {
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
that.editPlugin(that.options.urls.edit_plugin, that.options.plugin_name, that.options.plugin_breadcrumb);
|
||||
});
|
||||
|
||||
// adds edit tooltip
|
||||
this.container.bind('mouseover.cms mouseout.cms', function (e) {
|
||||
e.stopPropagation();
|
||||
var name = that.options.plugin_name;
|
||||
var id = that.options.plugin_id;
|
||||
(e.type === 'mouseover') ? that.showTooltip(name, id) : that.hideTooltip();
|
||||
});
|
||||
|
||||
// adds listener for all plugin updates
|
||||
this.container.bind('cms.plugins.update', function (e) {
|
||||
e.stopPropagation();
|
||||
that.movePlugin();
|
||||
});
|
||||
// adds listener for copy/paste updates
|
||||
this.container.bind('cms.plugin.update', function (e) {
|
||||
e.stopPropagation();
|
||||
|
||||
var el = $(e.delegateTarget);
|
||||
var dragitem = $('.cms_draggable-' + el.data('settings').plugin_id);
|
||||
var placeholder_id = that._getId(dragitem.parents('.cms_draggables').last().prevAll('.cms_dragbar').first());
|
||||
|
||||
// if placeholder_id is empty, cancel
|
||||
if(!placeholder_id) return false;
|
||||
|
||||
var data = el.data('settings');
|
||||
data.target = placeholder_id;
|
||||
data.parent= that._getId(dragitem.parent().closest('.cms_draggable'));
|
||||
|
||||
that.copyPlugin(data);
|
||||
});
|
||||
|
||||
// variables for dragitems
|
||||
var draggable = $('.cms_draggable-' + this.options.plugin_id);
|
||||
var dragitem = draggable.find('> .cms_dragitem');
|
||||
var submenu = draggable.find('.cms_submenu:eq(0)');
|
||||
var submenus = $('.cms_draggables').find('.cms_submenu');
|
||||
|
||||
// attach event to the plugin menu
|
||||
this._setSubnav(draggable.find('> .cms_dragitem .cms_submenu'));
|
||||
|
||||
// adds event for hiding the subnav
|
||||
draggable.bind('mouseenter mouseleave mouseover', function (e) {
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
|
||||
if(that.focused) return false;
|
||||
|
||||
if(e.type === 'mouseenter' || e.type === 'mouseover') $(this).data('active', true);
|
||||
if(e.type === 'mouseleave') {
|
||||
$(this).data('active', false);
|
||||
submenus.hide();
|
||||
}
|
||||
|
||||
// add timeout to determine if we should hide the element
|
||||
setTimeout(function () {
|
||||
if(!$(e.currentTarget).data('active')) {
|
||||
$(e.currentTarget).find('.cms_submenu:eq(0)').hide();
|
||||
}
|
||||
}, 100);
|
||||
});
|
||||
|
||||
// adds event for showing the subnav
|
||||
dragitem.bind('mouseenter', function (e) {
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
|
||||
submenus.hide();
|
||||
submenu.show();
|
||||
});
|
||||
|
||||
// adds double click to edit
|
||||
dragitem.bind('dblclick', function (e) {
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
that.editPlugin(that.options.urls.edit_plugin, that.options.plugin_name, that.options.plugin_breadcrumb);
|
||||
});
|
||||
},
|
||||
|
||||
_setGeneric: function () {
|
||||
var that = this;
|
||||
|
||||
// adds double click to edit
|
||||
this.container.bind('dblclick', function (e) {
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
that.editPlugin(that.options.urls.edit_plugin, that.options.plugin_name, []);
|
||||
});
|
||||
|
||||
// adds edit tooltip
|
||||
this.container.bind('mouseover.cms mouseout.cms', function (e) {
|
||||
e.stopPropagation();
|
||||
var name = that.options.plugin_name;
|
||||
var id = that.options.plugin_id;
|
||||
(e.type === 'mouseover') ? that.showTooltip(name, id) : that.hideTooltip();
|
||||
});
|
||||
},
|
||||
|
||||
// public methods
|
||||
addPlugin: function (type, name, parent) {
|
||||
// cancel request if already in progress
|
||||
if(CMS.API.locked) return false;
|
||||
CMS.API.locked = true;
|
||||
|
||||
var that = this;
|
||||
var data = {
|
||||
'placeholder_id': this.options.placeholder_id,
|
||||
'plugin_type': type,
|
||||
'plugin_parent': parent || '',
|
||||
'plugin_language': this.options.plugin_language,
|
||||
'csrfmiddlewaretoken': this.csrf
|
||||
};
|
||||
|
||||
$.ajax({
|
||||
'type': 'POST',
|
||||
'url': this.options.urls.add_plugin,
|
||||
'data': data,
|
||||
'success': function (data) {
|
||||
CMS.API.locked = false;
|
||||
that.newPlugin = data;
|
||||
that.editPlugin(data.url, name, data.breadcrumb);
|
||||
},
|
||||
'error': function (jqXHR) {
|
||||
CMS.API.locked = false;
|
||||
var msg = CMS.config.lang.error;
|
||||
// trigger error
|
||||
that._showError(msg + jqXHR.responseText || jqXHR.status + ' ' + jqXHR.statusText);
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
editPlugin: function (url, name, breadcrumb) {
|
||||
// trigger modal window
|
||||
var modal = new CMS.Modal({
|
||||
'newPlugin': this.newPlugin || false,
|
||||
'onClose': this.options.onClose || false,
|
||||
'redirectOnClose': this.options.redirectOnClose || false
|
||||
});
|
||||
modal.open(url, name, breadcrumb);
|
||||
},
|
||||
|
||||
copyPlugin: function (options, source_language) {
|
||||
// cancel request if already in progress
|
||||
if(CMS.API.locked) return false;
|
||||
CMS.API.locked = true;
|
||||
|
||||
var that = this;
|
||||
var move = (options || source_language) ? true : false;
|
||||
// set correct options
|
||||
options = options || this.options;
|
||||
if(source_language) {
|
||||
options.target = options.placeholder_id;
|
||||
options.plugin_id = '';
|
||||
options.parent = '';
|
||||
}
|
||||
else {
|
||||
source_language = options.plugin_language
|
||||
}
|
||||
|
||||
var data = {
|
||||
'source_placeholder_id': options.placeholder_id,
|
||||
'source_plugin_id': options.plugin_id || '',
|
||||
'source_language': source_language,
|
||||
'target_plugin_id': options.parent || '',
|
||||
'target_placeholder_id': options.target || CMS.config.clipboard.id,
|
||||
'target_language': options.page_language || source_language,
|
||||
'csrfmiddlewaretoken': this.csrf
|
||||
};
|
||||
var request = {
|
||||
'type': 'POST',
|
||||
'url': options.urls.copy_plugin,
|
||||
'data': data,
|
||||
'success': function () {
|
||||
CMS.API.Toolbar.openMessage(CMS.config.lang.success);
|
||||
// reload
|
||||
CMS.API.Helpers.reloadBrowser();
|
||||
},
|
||||
'error': function (jqXHR) {
|
||||
CMS.API.locked = false;
|
||||
var msg = CMS.config.lang.error;
|
||||
// trigger error
|
||||
that._showError(msg + jqXHR.responseText || jqXHR.status + ' ' + jqXHR.statusText);
|
||||
}
|
||||
};
|
||||
|
||||
if(move) {
|
||||
$.ajax(request);
|
||||
} else {
|
||||
// ensure clipboard is cleaned
|
||||
CMS.API.Clipboard.clear(function () {
|
||||
$.ajax(request);
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
cutPlugin: function () {
|
||||
// if cut is once triggered, prevend additional actions
|
||||
if(CMS.API.locked) return false;
|
||||
CMS.API.locked = true;
|
||||
|
||||
var that = this;
|
||||
var data = {
|
||||
'placeholder_id': CMS.config.clipboard.id,
|
||||
'plugin_id': this.options.plugin_id,
|
||||
'plugin_parent': '',
|
||||
'plugin_language': this.options.page_language,
|
||||
'plugin_order': [this.options.plugin_id],
|
||||
'csrfmiddlewaretoken': this.csrf
|
||||
};
|
||||
|
||||
// ensure clipboard is cleaned
|
||||
CMS.API.Clipboard.clear(function () {
|
||||
// cancel request if already in progress
|
||||
if(CMS.API.locked) return false;
|
||||
CMS.API.locked = true;
|
||||
|
||||
// move plugin
|
||||
$.ajax({
|
||||
'type': 'POST',
|
||||
'url': that.options.urls.move_plugin,
|
||||
'data': data,
|
||||
'success': function (response) {
|
||||
CMS.API.Toolbar.openMessage(CMS.config.lang.success);
|
||||
// if response is reload
|
||||
CMS.API.Helpers.reloadBrowser();
|
||||
},
|
||||
'error': function (jqXHR) {
|
||||
CMS.API.locked = false;
|
||||
var msg = CMS.config.lang.error;
|
||||
// trigger error
|
||||
that._showError(msg + jqXHR.responseText || jqXHR.status + ' ' + jqXHR.statusText);
|
||||
}
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
movePlugin: function (options) {
|
||||
// cancel request if already in progress
|
||||
if(CMS.API.locked) return false;
|
||||
CMS.API.locked = true;
|
||||
|
||||
var that = this;
|
||||
// set correct options
|
||||
options = options || this.options;
|
||||
|
||||
var plugin = $('.cms_plugin-' + options.plugin_id);
|
||||
var dragitem = $('.cms_draggable-' + options.plugin_id);
|
||||
|
||||
// SETTING POSITION
|
||||
this._setPosition(options.plugin_id, plugin, dragitem);
|
||||
|
||||
// SAVING POSITION
|
||||
var placeholder_id = this._getId(dragitem.parents('.cms_draggables').last().prevAll('.cms_dragbar').first());
|
||||
var plugin_parent = this._getId(dragitem.parent().closest('.cms_draggable'));
|
||||
var plugin_order = this._getIds(dragitem.siblings('.cms_draggable').andSelf());
|
||||
|
||||
// cancel here if we have no placeholder id
|
||||
if(placeholder_id === false) return false;
|
||||
|
||||
// gather the data for ajax request
|
||||
var data = {
|
||||
'placeholder_id': placeholder_id,
|
||||
'plugin_id': options.plugin_id,
|
||||
'plugin_parent': plugin_parent || '',
|
||||
// this is a hack: when moving to different languages use the global language
|
||||
'plugin_language': options.page_language,
|
||||
'plugin_order': plugin_order,
|
||||
'csrfmiddlewaretoken': this.csrf
|
||||
};
|
||||
|
||||
$.ajax({
|
||||
'type': 'POST',
|
||||
'url': options.urls.move_plugin,
|
||||
'data': data,
|
||||
'success': function (response) {
|
||||
// if response is reload
|
||||
if(response.reload) CMS.API.Helpers.reloadBrowser();
|
||||
|
||||
// enable actions again
|
||||
CMS.API.locked = false;
|
||||
|
||||
// TODO: show only if(response.status)
|
||||
that._showSuccess(dragitem);
|
||||
},
|
||||
'error': function (jqXHR) {
|
||||
CMS.API.locked = false;
|
||||
var msg = CMS.config.lang.error;
|
||||
// trigger error
|
||||
that._showError(msg + jqXHR.responseText || jqXHR.status + ' ' + jqXHR.statusText);
|
||||
}
|
||||
});
|
||||
|
||||
// show publish button
|
||||
$('.cms_btn-publish').addClass('cms_btn-publish-active').parent().show();
|
||||
|
||||
// enable revert to live
|
||||
$('.cms_toolbar-revert').removeClass('cms_toolbar-item-navigation-disabled');
|
||||
},
|
||||
|
||||
deletePlugin: function (url, name, breadcrumb) {
|
||||
// trigger modal window
|
||||
var modal = new CMS.Modal({
|
||||
'newPlugin': this.newPlugin || false,
|
||||
'onClose': this.options.onClose || false,
|
||||
'redirectOnClose': this.options.redirectOnClose || false
|
||||
});
|
||||
modal.open(url, name, breadcrumb);
|
||||
},
|
||||
|
||||
// private methods
|
||||
_setPosition: function (id, plugin, dragitem) {
|
||||
// after we insert the plugin onto its new place, we need to figure out where to position it
|
||||
var prevItem = dragitem.prev('.cms_draggable');
|
||||
var nextItem = dragitem.next('.cms_draggable');
|
||||
var parent = dragitem.parent().closest('.cms_draggable');
|
||||
var child = $('.cms_plugin-' + this._getId(parent));
|
||||
var placeholder = dragitem.closest('.cms_dragarea');
|
||||
|
||||
// determine if there are other plugins within the same level, this makes the move easier
|
||||
if(prevItem.length) {
|
||||
plugin.insertAfter($('.cms_plugin-' + this._getId(prevItem)));
|
||||
} else if(nextItem.length) {
|
||||
plugin.insertBefore($('.cms_plugin-' + this._getId(nextItem)));
|
||||
} else if(parent.length) {
|
||||
// if we can't find a plugin on the same level, we need to travel higher
|
||||
// for this we need to find the deepest child
|
||||
while(child.children().length) {
|
||||
child = child.children();
|
||||
}
|
||||
child.append(plugin);
|
||||
} else if(placeholder.length) {
|
||||
// we also need to cover the case if we move the plugin to an empty placeholder
|
||||
plugin.append($('.cms_plugin-' + this._getId(placeholder)));
|
||||
} else {
|
||||
// if we did not found a match, reload
|
||||
CMS.API.Helpers.reloadBrowser();
|
||||
}
|
||||
},
|
||||
|
||||
editPluginPostAjax: function(caller, toolbar, response){
|
||||
if (typeof toolbar == 'undefined' || typeof response == 'undefined') {
|
||||
return function(toolbar, response) {
|
||||
var that = caller;
|
||||
that.editPlugin(response['url'], that.options.plugin_name, response['breadcrumb']);
|
||||
}
|
||||
}
|
||||
that.editPlugin(response['url'], that.options.plugin_name, response['breadcrumb']);
|
||||
},
|
||||
|
||||
_setSubnav: function (nav) {
|
||||
var that = this;
|
||||
|
||||
nav.bind('mouseenter mouseleave tap.cms', function (e) {
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
(e.type === 'mouseenter') ? that._showSubnav($(this)) : that._hideSubnav($(this));
|
||||
});
|
||||
|
||||
nav.find('a').bind('click.cms tap.cms', function (e) {
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
|
||||
// show loader and make sure scroll doesn't jump
|
||||
CMS.API.Toolbar._loader(true);
|
||||
|
||||
var el = $(this);
|
||||
|
||||
// set switch for subnav entries
|
||||
switch(el.attr('data-rel')) {
|
||||
case 'add':
|
||||
that.addPlugin(el.attr('href').replace('#', ''), el.text(), that._getId(el.closest('.cms_draggable')));
|
||||
break;
|
||||
case 'ajax_add':
|
||||
CMS.API.Toolbar.openAjax(el.attr('href'), JSON.stringify(el.data('post')), el.data('text'), that.editPluginPostAjax(that), el.data('on-success'));
|
||||
break;
|
||||
case 'edit':
|
||||
that.editPlugin(that.options.urls.edit_plugin, that.options.plugin_name, that.options.plugin_breadcrumb);
|
||||
break;
|
||||
case 'copy-lang':
|
||||
that.copyPlugin(this.options, el.attr('data-language'));
|
||||
break;
|
||||
case 'copy':
|
||||
that.copyPlugin();
|
||||
break;
|
||||
case 'cut':
|
||||
that.cutPlugin();
|
||||
break;
|
||||
case 'delete':
|
||||
that.deletePlugin(that.options.urls.delete_plugin, that.options.plugin_name, that.options.plugin_breadcrumb);
|
||||
break;
|
||||
default:
|
||||
CMS.API.Toolbar._loader(false);
|
||||
CMS.API.Toolbar._delegate(el);
|
||||
}
|
||||
});
|
||||
|
||||
nav.find('input').bind('keyup keydown focus blur click', function (e) {
|
||||
if(e.type === 'focus') that.focused = true;
|
||||
if(e.type === 'blur' && !that.traverse) {
|
||||
that.focused = false;
|
||||
that._hideSubnav(nav);
|
||||
}
|
||||
if(e.type === 'keyup') {
|
||||
clearTimeout(that.timer);
|
||||
// keybound is not required
|
||||
that.timer = setTimeout(function () {
|
||||
that._searchSubnav(nav, $(e.currentTarget).val());
|
||||
}, 100);
|
||||
}
|
||||
});
|
||||
|
||||
// set data attributes for original top positioning
|
||||
nav.find('.cms_submenu-dropdown').each(function () {
|
||||
$(this).data('top', $(this).css('top'))
|
||||
});
|
||||
|
||||
// prevent propagnation
|
||||
nav.bind(this.click, function (e) {
|
||||
e.stopPropagation();
|
||||
});
|
||||
},
|
||||
|
||||
_showSubnav: function (nav) {
|
||||
var that = this;
|
||||
var dropdown = nav.find('.cms_submenu-dropdown');
|
||||
var offset = parseInt(dropdown.data('top'));
|
||||
|
||||
// clearing
|
||||
clearTimeout(this.timer);
|
||||
|
||||
// add small delay before showing submenu
|
||||
this.timer = setTimeout(function () {
|
||||
// reset z indexes
|
||||
var reset = $('.cms_submenu').parentsUntil('.cms_dragarea');
|
||||
var scrollHint = nav.find('.cms_submenu-scroll-hint');
|
||||
|
||||
reset.css('z-index', 0);
|
||||
|
||||
var parents = nav.parentsUntil('.cms_dragarea');
|
||||
parents.css('z-index', 999);
|
||||
|
||||
// show subnav
|
||||
nav.find('.cms_submenu-quicksearch').show();
|
||||
|
||||
// set visible states
|
||||
nav.find('> .cms_submenu-dropdown').show().on('scroll', function () {
|
||||
scrollHint.fadeOut(100);
|
||||
$(this).off('scroll');
|
||||
});
|
||||
|
||||
// show scrollHint for FF on OSX
|
||||
window.console.log(nav[0], nav[0].scrollHeight);
|
||||
if(nav[0].scrollHeight > 245) scrollHint.show();
|
||||
|
||||
}, 100);
|
||||
|
||||
// add key events
|
||||
$(document).unbind('keydown.cms');
|
||||
$(document).bind('keydown.cms', function (e) {
|
||||
var anchors = nav.find('.cms_submenu-item:visible a');
|
||||
var index = anchors.index(anchors.filter(':focus'));
|
||||
|
||||
// bind arrow down and tab keys
|
||||
if(e.keyCode === 40 || e.keyCode === 9) {
|
||||
that.traverse = true;
|
||||
e.preventDefault();
|
||||
if(index >= 0 && index < anchors.length - 1) {
|
||||
anchors.eq(index + 1).focus();
|
||||
} else {
|
||||
anchors.eq(0).focus();
|
||||
}
|
||||
}
|
||||
|
||||
// bind arrow up keys
|
||||
if(e.keyCode === 38) {
|
||||
e.preventDefault();
|
||||
if(anchors.is(':focus')) {
|
||||
anchors.eq(index - 1).focus();
|
||||
} else {
|
||||
anchors.eq(anchors.length).focus();
|
||||
}
|
||||
}
|
||||
|
||||
// hide subnav when hitting enter or escape
|
||||
if(e.keyCode === 13 || e.keyCode === 27) {
|
||||
that.traverse = false;
|
||||
nav.find('input').blur();
|
||||
that._hideSubnav(nav);
|
||||
}
|
||||
});
|
||||
|
||||
// calculate subnav bounds
|
||||
if($(window).height() + $(window).scrollTop() - nav.offset().top - dropdown.height() <= 10 && nav.offset().top - dropdown.height() >= 0) {
|
||||
dropdown.css('top', 'auto');
|
||||
dropdown.css('bottom', offset);
|
||||
// if parent is within a plugin, add additional offset
|
||||
if(dropdown.closest('.cms_draggable').length) dropdown.css('bottom', offset - 1);
|
||||
} else {
|
||||
dropdown.css('top', offset);
|
||||
dropdown.css('bottom', 'auto');
|
||||
}
|
||||
},
|
||||
|
||||
_hideSubnav: function (nav) {
|
||||
clearTimeout(this.timer);
|
||||
|
||||
var that = this;
|
||||
// cancel if quicksearch is focues
|
||||
if(this.focused) return false;
|
||||
|
||||
// set correct active state
|
||||
nav.closest('.cms_draggable').data('active', false);
|
||||
|
||||
this.timer = setTimeout(function () {
|
||||
// set visible states
|
||||
nav.find('> .cms_submenu-dropdown').hide();
|
||||
nav.find('.cms_submenu-quicksearch').hide();
|
||||
// reset search
|
||||
nav.find('input').val('');
|
||||
that._searchSubnav(nav, '');
|
||||
}, this.timeout);
|
||||
|
||||
// reset relativity
|
||||
$('.cms_dragbar').css('position', '');
|
||||
},
|
||||
|
||||
_searchSubnav: function (nav, value) {
|
||||
var items = nav.find('.cms_submenu-item');
|
||||
var titles = nav.find('.cms_submenu-item-title');
|
||||
|
||||
// cancel if value is zero
|
||||
if(value === '') {
|
||||
items.add(titles).show();
|
||||
return false;
|
||||
}
|
||||
|
||||
// loop through items and figure out if we need to hide items
|
||||
items.find('a, span').each(function (index, item) {
|
||||
item = $(item);
|
||||
var text = item.text().toLowerCase();
|
||||
var search = value.toLowerCase();
|
||||
|
||||
(text.indexOf(search) >= 0) ? item.parent().show() : item.parent().hide();
|
||||
});
|
||||
|
||||
// check if a title is matching
|
||||
titles.filter(':visible').each(function (index, item) {
|
||||
titles.hide();
|
||||
$(item).nextUntil('.cms_submenu-item-title').show();
|
||||
});
|
||||
|
||||
// always display title of a category
|
||||
items.filter(':visible').each(function (index, item) {
|
||||
if($(item).prev().hasClass('cms_submenu-item-title')) {
|
||||
$(item).prev().show();
|
||||
} else {
|
||||
$(item).prevUntil('.cms_submenu-item-title').last().prev().show();
|
||||
}
|
||||
});
|
||||
|
||||
// if there is no element visible, show only first categoriy
|
||||
nav.find('.cms_submenu-dropdown').show();
|
||||
if(items.add(titles).filter(':visible').length <= 0) {
|
||||
nav.find('.cms_submenu-dropdown').hide();
|
||||
}
|
||||
|
||||
// hide scrollHint
|
||||
nav.find('.cms_submenu-scroll-hint').hide();
|
||||
},
|
||||
|
||||
_collapsables: function () {
|
||||
// one time setup
|
||||
var that = this;
|
||||
var settings = CMS.settings;
|
||||
var draggable = $('.cms_draggable-' + this.options.plugin_id);
|
||||
|
||||
// check which button should be shown for collapsemenu
|
||||
this.container.each(function (index, item) {
|
||||
var els = $(item).find('.cms_dragitem-collapsable');
|
||||
var open = els.filter('.cms_dragitem-expanded');
|
||||
if(els.length === open.length && (els.length + open.length !== 0)) {
|
||||
$(item).find('.cms_dragbar-title').addClass('cms_dragbar-title-expanded');
|
||||
}
|
||||
});
|
||||
// cancel here if its not a draggable
|
||||
if(!draggable.length) return false;
|
||||
|
||||
// attach events to draggable
|
||||
draggable.find('> .cms_dragitem-collapsable').bind(this.click, function () {
|
||||
var el = $(this);
|
||||
var id = that._getId($(this).parent());
|
||||
|
||||
var settings = CMS.settings;
|
||||
settings.states = settings.states || [];
|
||||
|
||||
// collapsable function and save states
|
||||
if(el.hasClass('cms_dragitem-expanded')) {
|
||||
settings.states.splice($.inArray(id, settings.states), 1);
|
||||
el.removeClass('cms_dragitem-expanded').parent().find('> .cms_draggables').hide();
|
||||
} else {
|
||||
settings.states.push(id);
|
||||
el.addClass('cms_dragitem-expanded').parent().find('> .cms_draggables').show();
|
||||
}
|
||||
|
||||
// save settings
|
||||
CMS.API.Toolbar.setSettings(settings);
|
||||
});
|
||||
// adds double click event
|
||||
draggable.bind('dblclick', function (e) {
|
||||
e.stopPropagation();
|
||||
$('.cms_plugin-' + that._getId($(this))).trigger('dblclick');
|
||||
});
|
||||
|
||||
// only needs to be excecuted once
|
||||
if(CMS.Toolbar.ready) return false;
|
||||
|
||||
// removing dublicate entries
|
||||
var sortedArr = settings.states.sort();
|
||||
var filteredArray = [];
|
||||
for(var i = 0; i < sortedArr.length; i++) {
|
||||
if(sortedArr[i] !== sortedArr[i + 1]) {
|
||||
filteredArray.push(sortedArr[i]);
|
||||
}
|
||||
}
|
||||
settings.states = filteredArray;
|
||||
|
||||
// loop through the items
|
||||
$.each(CMS.settings.states, function (index, id) {
|
||||
var el = $('.cms_draggable-' + id);
|
||||
// only add this class to elements which have a draggable area
|
||||
if(el.find('.cms_draggables').length) {
|
||||
el.find('> .cms_draggables').show();
|
||||
el.find('> .cms_dragitem').addClass('cms_dragitem-expanded');
|
||||
}
|
||||
});
|
||||
|
||||
// set global setup
|
||||
CMS.Toolbar.ready = true;
|
||||
},
|
||||
|
||||
_expandAll: function (el) {
|
||||
var items = el.closest('.cms_dragarea').find('.cms_dragitem-collapsable');
|
||||
// cancel if there are no items
|
||||
if(!items.length) return false;
|
||||
items.each(function () {
|
||||
if(!$(this).hasClass('cms_dragitem-expanded')) $(this).trigger('click.cms');
|
||||
});
|
||||
|
||||
el.addClass('cms_dragbar-title-expanded');
|
||||
},
|
||||
|
||||
_collapseAll: function (el) {
|
||||
var items = el.closest('.cms_dragarea').find('.cms_dragitem-collapsable');
|
||||
items.each(function () {
|
||||
if($(this).hasClass('cms_dragitem-expanded')) $(this).trigger('click.cms');
|
||||
});
|
||||
|
||||
el.removeClass('cms_dragbar-title-expanded');
|
||||
},
|
||||
|
||||
_getId: function (el) {
|
||||
return CMS.API.StructureBoard.getId(el);
|
||||
},
|
||||
|
||||
_getIds: function (els) {
|
||||
return CMS.API.StructureBoard.getIds(els);
|
||||
},
|
||||
|
||||
_showError: function (msg) {
|
||||
return CMS.API.Toolbar.showError(msg, true);
|
||||
},
|
||||
|
||||
_showSuccess: function (el) {
|
||||
var tpl = $('<div class="cms_dragitem-success"></div>');
|
||||
el.append(tpl);
|
||||
// start animation
|
||||
tpl.fadeOut(function () {
|
||||
$(this).remove()
|
||||
});
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
});
|
||||
})(CMS.$);
|
||||
366
static/cms/js/modules/cms.sideframe.js
Normal file
|
|
@ -0,0 +1,366 @@
|
|||
/*##################################################|*/
|
||||
/* #CMS# */
|
||||
(function($) {
|
||||
// CMS.$ will be passed for $
|
||||
$(document).ready(function () {
|
||||
/*!
|
||||
* Sideframe
|
||||
* Controls a cms specific sideframe
|
||||
*/
|
||||
CMS.Sideframe = new CMS.Class({
|
||||
|
||||
implement: [CMS.API.Helpers],
|
||||
|
||||
options: {
|
||||
'onClose': false,
|
||||
'sideframeDuration': 300,
|
||||
'sideframeWidth': 320,
|
||||
'urls': {
|
||||
'css_sideframe': 'cms/css/cms.toolbar.sideframe.css'
|
||||
}
|
||||
},
|
||||
|
||||
initialize: function (options) {
|
||||
this.options = $.extend(true, {}, this.options, options);
|
||||
this.config = CMS.config;
|
||||
this.settings = CMS.settings;
|
||||
|
||||
// elements
|
||||
this.sideframe = $('.cms_sideframe');
|
||||
this.body = $('html');
|
||||
|
||||
// states
|
||||
this.click = (document.ontouchstart !== null) ? 'click.cms' : 'touchend.cms click.cms';
|
||||
this.enforceReload = false;
|
||||
|
||||
// if the modal is initialized the first time, set the events
|
||||
if(!this.sideframe.data('ready')) this._events();
|
||||
|
||||
// ready sideframe
|
||||
this.sideframe.data('ready', true);
|
||||
},
|
||||
|
||||
// initial methods
|
||||
_events: function () {
|
||||
var that = this;
|
||||
|
||||
// attach close event
|
||||
this.sideframe.find('.cms_sideframe-close').bind(this.click, function () {
|
||||
that.close(true);
|
||||
});
|
||||
|
||||
// attach hide event
|
||||
this.sideframe.find('.cms_sideframe-hide').bind(this.click, function () {
|
||||
if($(this).hasClass('cms_sideframe-hidden')) {
|
||||
that.settings.sideframe.hidden = false;
|
||||
that._show(that.settings.sideframe.position || that.options.sideframeWidth, true);
|
||||
} else {
|
||||
that.settings.sideframe.hidden = true;
|
||||
that._hide();
|
||||
}
|
||||
that.settings = that.setSettings(that.settings);
|
||||
});
|
||||
|
||||
// attach maximize event
|
||||
this.sideframe.find('.cms_sideframe-maximize').bind(this.click, function () {
|
||||
if($(this).hasClass('cms_sideframe-minimize')) {
|
||||
that.settings.sideframe.maximized = false;
|
||||
that._minimize();
|
||||
} else {
|
||||
that.settings.sideframe.maximized = true;
|
||||
that.settings.sideframe.hidden = false;
|
||||
that._maximize();
|
||||
}
|
||||
that.settings = that.setSettings(that.settings);
|
||||
});
|
||||
|
||||
this.sideframe.find('.cms_sideframe-resize').bind('mousedown', function (e) {
|
||||
e.preventDefault();
|
||||
that._startResize();
|
||||
});
|
||||
|
||||
// stopper events
|
||||
$(document).bind('mouseup.cms', function () {
|
||||
that._stopResize();
|
||||
});
|
||||
},
|
||||
|
||||
// public methods
|
||||
open: function (url, animate) {
|
||||
// prepare iframe
|
||||
var that = this;
|
||||
var language = 'language=' + CMS.config.request.language;
|
||||
var page_id = 'page_id=' + CMS.config.request.page_id;
|
||||
var holder = this.sideframe.find('.cms_sideframe-frame');
|
||||
var initialized = false;
|
||||
|
||||
// push required params if defined
|
||||
// only apply params on tree view
|
||||
if(url.indexOf(CMS.config.request.tree) >= 0) {
|
||||
var params = [];
|
||||
if(CMS.config.request.language) params.push(language);
|
||||
if(CMS.config.request.page_id) params.push(page_id);
|
||||
url = this._url(url, params);
|
||||
}
|
||||
|
||||
var iframe = $('<iframe src="'+url+'" class="" frameborder="0" />');
|
||||
iframe.hide();
|
||||
var width = this.settings.sideframe.position || this.options.sideframeWidth;
|
||||
|
||||
// attach load event to iframe
|
||||
iframe.bind('load', function () {
|
||||
var contents = iframe.contents();
|
||||
|
||||
// after iframe is loaded append css
|
||||
contents.find('head').append($('<link rel="stylesheet" type="text/css" href="' + that.config.urls.static + that.options.urls.css_sideframe + '" />'));
|
||||
// remove loader
|
||||
that.sideframe.find('.cms_sideframe-frame').removeClass('cms_loader');
|
||||
// than show
|
||||
iframe.show();
|
||||
|
||||
// add debug infos
|
||||
if(that.config.debug) iframe.contents().find('body').addClass('cms_debug');
|
||||
|
||||
// save url in settings
|
||||
that.settings.sideframe.url = iframe.get(0).contentWindow.location.href;
|
||||
that.settings = that.setSettings(that.settings);
|
||||
|
||||
// bind extra events
|
||||
contents.find('body').bind(that.click, function () {
|
||||
$(document).trigger(that.click);
|
||||
});
|
||||
|
||||
// attach reload event
|
||||
if(initialized) that.reloadBrowser(false, false, true);
|
||||
initialized = true;
|
||||
|
||||
// adding django hacks
|
||||
contents.find('.viewsitelink').attr('target', '_top');
|
||||
});
|
||||
|
||||
// cancel animation if sideframe is already shown
|
||||
if(this.sideframe.is(':visible')) {
|
||||
// sideframe is already open
|
||||
insertHolder(iframe);
|
||||
// reanimate the frame
|
||||
if(this.sideframe.outerWidth() < width) {
|
||||
// The user has performed an action that requires the
|
||||
// sideframe to be shown, this intent outweighs any
|
||||
// previous intent to minimize the frame.
|
||||
this.settings.sideframe.hidden = false;
|
||||
this._show(width, animate);
|
||||
}
|
||||
} else {
|
||||
// load iframe after frame animation is done
|
||||
setTimeout(function () {
|
||||
insertHolder(iframe);
|
||||
}, this.options.sideframeDuration);
|
||||
// display the frame
|
||||
this._show(width, animate);
|
||||
}
|
||||
|
||||
function insertHolder(iframe) {
|
||||
// show iframe after animation
|
||||
that.sideframe.find('.cms_sideframe-frame').addClass('cms_loader');
|
||||
holder.html(iframe);
|
||||
}
|
||||
},
|
||||
|
||||
close: function () {
|
||||
this._hide(true);
|
||||
|
||||
// remove url in settings
|
||||
this.settings.sideframe = {
|
||||
'url': null,
|
||||
'hidden': false,
|
||||
'maximized': false,
|
||||
'width': this.options.sideframeWidth
|
||||
};
|
||||
|
||||
// resets
|
||||
this.sideframe.find('.cms_sideframe-maximize').removeClass('cms_sideframe-minimize');
|
||||
this.sideframe.find('.cms_sideframe-hide').show();
|
||||
|
||||
// update settings
|
||||
this.settings = this.setSettings(this.settings);
|
||||
|
||||
// handle refresh option
|
||||
this.reloadBrowser(this.options.onClose, false, true);
|
||||
},
|
||||
|
||||
// private methods
|
||||
_show: function (width, animate) {
|
||||
// add class
|
||||
this.sideframe.find('.cms_sideframe-hide').removeClass('cms_sideframe-hidden');
|
||||
|
||||
// make sure the close / hide / maximize controls appear, regardless of hidden / maximized state
|
||||
this.sideframe.show();
|
||||
|
||||
// check if sideframe should be hidden
|
||||
if(this.settings.sideframe.hidden) this._hide();
|
||||
|
||||
// check if sideframe should be maximized
|
||||
if(this.settings.sideframe.maximized) this._maximize();
|
||||
|
||||
// otherwise do normal behaviour
|
||||
if(!this.settings.sideframe.hidden && !this.settings.sideframe.maximized) {
|
||||
if(animate) {
|
||||
this.sideframe.animate({ 'width': width }, this.options.sideframeDuration);
|
||||
this.body.animate({ 'margin-left': width }, this.options.sideframeDuration);
|
||||
} else {
|
||||
this.sideframe.animate({ 'width': width }, 0);
|
||||
this.body.animate({ 'margin-left': width }, 0);
|
||||
// reset width if larger than available space
|
||||
if(width >= $(window).width()) {
|
||||
this.sideframe.animate({ 'width': $(window).width() - 20 }, 0);
|
||||
this.body.animate({ 'margin-left': $(window).width() - 20 }, 0);
|
||||
}
|
||||
}
|
||||
this.sideframe.find('.cms_sideframe-btn').css('right', -20);
|
||||
}
|
||||
|
||||
// lock toolbar, set timeout to make sure CMS.API is ready
|
||||
setTimeout(function () {
|
||||
CMS.API.Toolbar._lock(true);
|
||||
CMS.API.Toolbar._showToolbar(true);
|
||||
}, 100);
|
||||
},
|
||||
|
||||
_hide: function (close) {
|
||||
// add class
|
||||
this.sideframe.find('.cms_sideframe-hide').addClass('cms_sideframe-hidden');
|
||||
|
||||
var duration = this.options.sideframeDuration;
|
||||
// remove the iframe
|
||||
if(close && this.sideframe.width() <= 0) duration = 0;
|
||||
if(close) this.sideframe.find('iframe').remove();
|
||||
this.sideframe.animate({ 'width': 0 }, duration, function () {
|
||||
if(close) $(this).hide();
|
||||
});
|
||||
this.body.animate({ 'margin-left': 0 }, duration);
|
||||
this.sideframe.find('.cms_sideframe-frame').removeClass('cms_loader');
|
||||
|
||||
// lock toolbar, set timeout to make sure CMS.API is ready
|
||||
setTimeout(function () {
|
||||
CMS.API.Toolbar._lock(false);
|
||||
}, 100);
|
||||
},
|
||||
|
||||
_minimize: function (noPositionReset) {
|
||||
this.sideframe.find('.cms_sideframe-maximize').removeClass('cms_sideframe-minimize');
|
||||
this.sideframe.find('.cms_sideframe-hide').show();
|
||||
|
||||
// reset to first state
|
||||
if(!noPositionReset) {
|
||||
this._show(this.settings.sideframe.position || this.options.sideframeWidth, true);
|
||||
}
|
||||
|
||||
// remove event
|
||||
$(window).unbind('resize.cms.sideframe');
|
||||
},
|
||||
|
||||
_maximize: function () {
|
||||
var that = this;
|
||||
|
||||
this.sideframe.find('.cms_sideframe-maximize').addClass('cms_sideframe-minimize');
|
||||
this.sideframe.find('.cms_sideframe-hide').hide();
|
||||
|
||||
this.sideframe.find('.cms_sideframe-hide').removeClass('cms_sideframe-hidden').hide();
|
||||
// do custom animation
|
||||
this.sideframe.animate({ 'width': $(window).width() }, 0);
|
||||
this.body.animate({ 'margin-left': 0 }, 0);
|
||||
// invert icon position
|
||||
this.sideframe.find('.cms_sideframe-btn').css('right', -2);
|
||||
// attach resize event
|
||||
$(window).bind('resize.cms.sideframe', function () {
|
||||
that.sideframe.css('width', $(window).width());
|
||||
});
|
||||
},
|
||||
|
||||
_startResize: function () {
|
||||
var that = this;
|
||||
var outerOffset = 20;
|
||||
var timer = function () {};
|
||||
// this prevents the iframe from being focusable
|
||||
this.sideframe.find('.cms_sideframe-shim').css('z-index', 20);
|
||||
this._minimize(true);
|
||||
|
||||
$(document).bind('mousemove.cms', function (e) {
|
||||
if(e.clientX <= 320) e.clientX = 320;
|
||||
if(e.clientX >= $(window).width() - outerOffset) e.clientX = $(window).width() - outerOffset;
|
||||
|
||||
that.sideframe.css('width', e.clientX);
|
||||
that.body.css('margin-left', e.clientX);
|
||||
|
||||
// update settings
|
||||
that.settings.sideframe.position = e.clientX;
|
||||
|
||||
// trigger the resize event
|
||||
$(window).trigger('resize.sideframe');
|
||||
|
||||
// save position
|
||||
clearTimeout(timer);
|
||||
timer = setTimeout(function () {
|
||||
that.settings = that.setSettings(that.settings);
|
||||
}, 500);
|
||||
});
|
||||
},
|
||||
|
||||
_stopResize: function () {
|
||||
this.sideframe.find('.cms_sideframe-shim').css('z-index', 1);
|
||||
|
||||
$(document).unbind('mousemove.cms');
|
||||
},
|
||||
|
||||
_url: function (url, params) {
|
||||
var arr = [];
|
||||
var keys = [];
|
||||
var values = [];
|
||||
var tmp = '';
|
||||
var urlArray = [];
|
||||
var urlParams = [];
|
||||
var origin = url;
|
||||
|
||||
// return url if there is no param
|
||||
if(!(url.split('?').length <= 1 || window.JSON === undefined)) {
|
||||
// setup local vars
|
||||
urlArray = url.split('?');
|
||||
urlParams = urlArray[1].split('&');
|
||||
origin = urlArray[0];
|
||||
}
|
||||
|
||||
// loop through the available params
|
||||
$.each(urlParams, function (index, param) {
|
||||
arr.push({ 'param': param.split('=')[0], 'value': param.split('=')[1] });
|
||||
});
|
||||
// loop through the new params
|
||||
$.each(params, function (index, param) {
|
||||
arr.push({ 'param': param.split('=')[0], 'value': param.split('=')[1] });
|
||||
});
|
||||
|
||||
// merge manually because jquery...
|
||||
$.each(arr, function (index, item) {
|
||||
var i = $.inArray(item.param, keys);
|
||||
|
||||
if(i === -1) {
|
||||
keys.push(item.param);
|
||||
values.push(item.value);
|
||||
} else {
|
||||
values[i] = item.value;
|
||||
}
|
||||
});
|
||||
|
||||
// merge new url
|
||||
$.each(keys, function (index, key) {
|
||||
tmp += '&' + key + '=' + values[index];
|
||||
});
|
||||
tmp = tmp.replace('&', '?');
|
||||
url = origin + tmp;
|
||||
|
||||
return url;
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
});
|
||||
})(CMS.$);
|
||||
493
static/cms/js/modules/cms.structureboard.js
Normal file
|
|
@ -0,0 +1,493 @@
|
|||
/*##################################################|*/
|
||||
/* #CMS# */
|
||||
(function($) {
|
||||
// CMS.$ will be passed for $
|
||||
$(document).ready(function () {
|
||||
/*!
|
||||
* StructureBoard
|
||||
* handles drag & drop, mode switching and
|
||||
*/
|
||||
CMS.StructureBoard = new CMS.Class({
|
||||
|
||||
implement: [CMS.API.Helpers],
|
||||
|
||||
options: {
|
||||
'speed': 300
|
||||
},
|
||||
|
||||
initialize: function (options) {
|
||||
this.container = $('.cms_structure');
|
||||
this.options = $.extend(true, {}, this.options, options);
|
||||
this.config = CMS.config;
|
||||
this.settings = CMS.settings;
|
||||
|
||||
// elements
|
||||
this.toolbar = $('#cms_toolbar');
|
||||
this.sortables = $('.cms_draggables'); // use global scope
|
||||
this.plugins = $('.cms_plugin');
|
||||
this.render_model = $('.cms_render_model');
|
||||
this.placeholders = $('.cms_placeholder');
|
||||
this.dragitems = $('.cms_draggable');
|
||||
this.dragareas = $('.cms_dragarea');
|
||||
this.dropareas = $('.cms_droppable');
|
||||
this.dimmer = this.container.find('.cms_structure-dimmer');
|
||||
this.clipboard = $('.cms_clipboard');
|
||||
|
||||
// states
|
||||
this.click = (document.ontouchstart !== null) ? 'click.cms' : 'tap.cms click.cms';
|
||||
this.timer = function () {};
|
||||
this.interval = function () {};
|
||||
this.state = false;
|
||||
this.dragging = false;
|
||||
|
||||
// setup initial stuff
|
||||
this._setup();
|
||||
|
||||
// setup events
|
||||
this._events();
|
||||
},
|
||||
|
||||
// initial methods
|
||||
_setup: function () {
|
||||
var that = this;
|
||||
|
||||
// cancel if there are no dragareas
|
||||
if(!this.dragareas.length) return false;
|
||||
|
||||
// cancel if there is no structure / content switcher
|
||||
if(!this.toolbar.find('.cms_toolbar-item-cms-mode-switcher').length) return false;
|
||||
|
||||
// setup toolbar mode
|
||||
if(this.settings.mode === 'structure') setTimeout(function () { that.show(true); }, 100);
|
||||
|
||||
// check if modes should be visible
|
||||
if(this.placeholders.length) {
|
||||
this.toolbar.find('.cms_toolbar-item-cms-mode-switcher').show();
|
||||
}
|
||||
|
||||
// add drag & drop functionality
|
||||
this._drag();
|
||||
// prevent click events to detect double click
|
||||
// this.preventEvents(this.plugins);
|
||||
},
|
||||
|
||||
_events: function () {
|
||||
var that = this;
|
||||
var modes = this.toolbar.find('.cms_toolbar-item-cms-mode-switcher a');
|
||||
|
||||
// show edit mode
|
||||
modes.eq(1).bind(this.click, function (e) {
|
||||
e.preventDefault();
|
||||
// cancel if already active
|
||||
if(that.settings.mode === 'edit') return false;
|
||||
// otherwise hide
|
||||
that.hide();
|
||||
});
|
||||
// show structure mode
|
||||
modes.eq(0).bind(this.click, function (e) {
|
||||
e.preventDefault();
|
||||
// cancel if already active
|
||||
if(that.settings.mode === 'structure') return false;
|
||||
// otherwise show
|
||||
that.show();
|
||||
});
|
||||
|
||||
// keyboard handling
|
||||
$(document).bind('keydown', function (e) {
|
||||
// check if we have an important focus
|
||||
var fields = $('*:focus');
|
||||
// 32 = space
|
||||
if(e.keyCode === 32 && that.settings.mode === 'structure' && !fields.length) {
|
||||
// cancel if there is no structure / content switcher
|
||||
if(!that.toolbar.find('.cms_toolbar-item-cms-mode-switcher').length) return false;
|
||||
e.preventDefault();
|
||||
that.hide();
|
||||
} else if(e.keyCode === 32 && that.settings.mode === 'edit' && !fields.length) {
|
||||
// cancel if there is no structure / content switcher
|
||||
if(!that.toolbar.find('.cms_toolbar-item-cms-mode-switcher').length) return false;
|
||||
e.preventDefault();
|
||||
that.show();
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
// public methods
|
||||
show: function (init) {
|
||||
// cancel show if live modus is active
|
||||
if(CMS.config.mode === 'live') return false;
|
||||
|
||||
// set active item
|
||||
var modes = this.toolbar.find('.cms_toolbar-item-cms-mode-switcher a');
|
||||
modes.removeClass('cms_btn-active').eq(0).addClass('cms_btn-active');
|
||||
|
||||
// show clipboard
|
||||
this.clipboard.css('opacity', 1).fadeIn(this.options.speed);
|
||||
|
||||
// apply new settings
|
||||
this.settings.mode = 'structure';
|
||||
if(!init) this.settings = this.setSettings(this.settings);
|
||||
|
||||
// ensure all elements are visible
|
||||
this.dragareas.show();
|
||||
|
||||
// show canvas
|
||||
this._showBoard();
|
||||
},
|
||||
|
||||
hide: function (init) {
|
||||
// cancel show if live modus is active
|
||||
if(CMS.config.mode === 'live') return false;
|
||||
|
||||
// set active item
|
||||
var modes = this.toolbar.find('.cms_toolbar-item-cms-mode-switcher a');
|
||||
modes.removeClass('cms_btn-active').eq(1).addClass('cms_btn-active');
|
||||
|
||||
// hide clipboard if in edit mode
|
||||
this.container.find('.cms_clipboard').hide();
|
||||
|
||||
// hide clipboard
|
||||
this.clipboard.hide();
|
||||
|
||||
this.settings.mode = 'edit';
|
||||
if(!init) this.settings = this.setSettings(this.settings);
|
||||
|
||||
// hide canvas
|
||||
this._hideBoard();
|
||||
},
|
||||
|
||||
getId: function (el) {
|
||||
// cancel if no element is defined
|
||||
if(el === undefined || el === null || el.length <= 0) return false;
|
||||
|
||||
var id = null;
|
||||
var cls = el.attr('class').split(' ')[1];
|
||||
|
||||
if(el.hasClass('cms_plugin')) {
|
||||
id = cls.replace('cms_plugin-', '');
|
||||
} else if(el.hasClass('cms_draggable')) {
|
||||
id = cls.replace('cms_draggable-', '');
|
||||
} else if(el.hasClass('cms_placeholder')) {
|
||||
id = cls.replace('cms_placeholder-', '');
|
||||
} else if(el.hasClass('cms_dragbar')) {
|
||||
id = cls.replace('cms_dragbar-', '');
|
||||
} else if(el.hasClass('cms_dragarea')) {
|
||||
id = cls.replace('cms_dragarea-', '');
|
||||
}
|
||||
|
||||
return id;
|
||||
},
|
||||
|
||||
getIds: function (els) {
|
||||
var that = this;
|
||||
var array = [];
|
||||
els.each(function () {
|
||||
array.push(that.getId($(this)));
|
||||
});
|
||||
return array;
|
||||
},
|
||||
|
||||
setActive: function (id, state) {
|
||||
var that = this;
|
||||
// resets
|
||||
this.dragitems.removeClass('cms_draggable-selected');
|
||||
this.plugins.removeClass('cms_plugin-active');
|
||||
|
||||
// only reset if no id is provided
|
||||
if(id === false) return false;
|
||||
|
||||
// attach active class to current element
|
||||
var dragitem = $('.cms_draggable-' + id);
|
||||
var plugin = $('.cms_plugin-' + id);
|
||||
|
||||
// if we switch from content to edit, show only a single plcaeholder
|
||||
if(state) {
|
||||
// quick show
|
||||
this._showBoard();
|
||||
|
||||
// show clipboard
|
||||
this.clipboard.show().css('opacity', 0.2);
|
||||
|
||||
// prevent default visibility
|
||||
this.dragareas.css('opacity', 0.2);
|
||||
|
||||
// show single placeholder
|
||||
dragitem.closest('.cms_dragarea').show().css('opacity', 1);
|
||||
|
||||
// otherwise hide and reset the board
|
||||
} else {
|
||||
this.hide();
|
||||
}
|
||||
|
||||
// collapse all previous elements
|
||||
var collapsed = dragitem.parentsUntil('.cms_dragarea').siblings().not('.cms_dragitem-expanded');
|
||||
collapsed.trigger(this.click);
|
||||
|
||||
// set new classes
|
||||
dragitem.addClass('cms_draggable-selected');
|
||||
plugin.addClass('cms_plugin-active');
|
||||
},
|
||||
|
||||
preventEvents: function (elements) {
|
||||
var clicks = 0;
|
||||
var delay = 500;
|
||||
var timer = function () {};
|
||||
|
||||
// unbind click event if already initialized
|
||||
elements.find('a').bind(this.click, function (e) {
|
||||
e.preventDefault();
|
||||
|
||||
// increment
|
||||
clicks++;
|
||||
|
||||
// single click
|
||||
if(clicks === 1) {
|
||||
timer = setTimeout(function () {
|
||||
clicks = 0;
|
||||
// cancel if link contains a hash
|
||||
if($(e.currentTarget).attr('href').indexOf('#') === 0) return false;
|
||||
// we need to redirect to the default behaviours
|
||||
// all events will be lost in edit mode, use '#' if href should not be triggered
|
||||
window.location.href = $(e.currentTarget).attr('href');
|
||||
}, delay);
|
||||
}
|
||||
|
||||
// double click
|
||||
if(clicks === 2) {
|
||||
clearTimeout(timer);
|
||||
clicks = 0;
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
// private methods
|
||||
_showBoard: function () {
|
||||
var that = this;
|
||||
var timer = function () {};
|
||||
|
||||
// show container
|
||||
this.container.show();
|
||||
this.dimmer.fadeIn(100);
|
||||
this.dragareas.css('opacity', 1);
|
||||
|
||||
// add dimmer close
|
||||
this.dimmer.bind('mousedown mouseup', function (e) {
|
||||
// cancel on rightclick
|
||||
if(e.which === 3 || e.button === 2) return false;
|
||||
// proceed
|
||||
clearTimeout(timer);
|
||||
timer = setTimeout(function () {
|
||||
that.hide();
|
||||
}, 500);
|
||||
|
||||
if(e.type === 'mouseup') clearTimeout(timer);
|
||||
});
|
||||
|
||||
this.plugins.not(this.render_model).hide();
|
||||
this.placeholders.show();
|
||||
|
||||
// attach event
|
||||
$(window).bind('resize.sideframe', function () {
|
||||
that._resizeBoard();
|
||||
}).trigger('resize.sideframe');
|
||||
|
||||
},
|
||||
|
||||
_hideBoard: function () {
|
||||
// hide elements
|
||||
this.container.hide();
|
||||
this.plugins.show();
|
||||
this.placeholders.hide();
|
||||
this.dimmer.hide();
|
||||
|
||||
// detach event
|
||||
$(window).unbind('resize.sideframe');
|
||||
|
||||
// clear interval
|
||||
clearInterval(this.interval);
|
||||
|
||||
$(window).trigger('structureboard_hidden.sideframe');
|
||||
},
|
||||
|
||||
_resizeBoard: function () {
|
||||
// calculate placeholder position
|
||||
var id = null;
|
||||
var area = null;
|
||||
var min = null;
|
||||
var areaParentOffset = null;
|
||||
|
||||
// start calculating
|
||||
this.placeholders.each(function (index, item) {
|
||||
item = $(item);
|
||||
id = item.data('settings').placeholder_id;
|
||||
area = $('.cms_dragarea-' + id);
|
||||
// to calculate the correct offset, we need to set the
|
||||
// placeholders correct heights and than set the according position
|
||||
item.height(area.outerHeight(true));
|
||||
// set min width
|
||||
min = (item.width()) ? 0 : 150;
|
||||
// as area is "css positioned" and jquery offset function is relative to the
|
||||
// document (not the first relative/absolute parent) we need to substract
|
||||
// first relative/absolute parent offset.
|
||||
areaParentOffset = $(area).offsetParent().offset();
|
||||
area.css({
|
||||
'top': item.offset().top - areaParentOffset.top - 5,
|
||||
'left': item.offset().left - areaParentOffset.left - min,
|
||||
'width': item.width() + min
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
_drag: function () {
|
||||
var that = this;
|
||||
var dropped = false;
|
||||
var droparea = null;
|
||||
var dropzone = null;
|
||||
|
||||
this.sortables.nestedSortable({
|
||||
'items': '.cms_draggable',
|
||||
'handle': '.cms_dragitem',
|
||||
'placeholder': 'cms_droppable',
|
||||
'connectWith': this.sortables,
|
||||
'tolerance': 'pointer',
|
||||
'toleranceElement': '> div',
|
||||
'dropOnEmpty': true,
|
||||
'forcePlaceholderSize': true,
|
||||
'helper': 'clone',
|
||||
'appendTo': 'body',
|
||||
'cursor': 'move',
|
||||
'opacity': 0.4,
|
||||
'zIndex': 9999999,
|
||||
'delay': 100,
|
||||
'refreshPositions': true,
|
||||
// nestedSortable
|
||||
'listType': 'div.cms_draggables',
|
||||
'doNotClear': true,
|
||||
//'disableNestingClass': 'cms_draggable-disabled',
|
||||
//'errorClass': 'cms_draggable-disallowed',
|
||||
//'hoveringClass': 'cms_draggable-hover',
|
||||
// methods
|
||||
'start': function (e, ui) {
|
||||
that.dragging = true;
|
||||
// show empty
|
||||
$('.cms_dragbar-empty-wrapper').show();
|
||||
// ensure all menus are closed
|
||||
$('.cms_dragitem .cms_submenu').hide();
|
||||
// remove classes from empty dropzones
|
||||
$('.cms_dragbar-empty').removeClass('cms_draggable-disallowed');
|
||||
// fixes placeholder height
|
||||
ui.placeholder.height(ui.item.height());
|
||||
// show placeholder without entries
|
||||
$('.cms_draggables').each(function () {
|
||||
if($(this).children().length === 0) {
|
||||
$(this).show();
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
'stop': function (event, ui) {
|
||||
that.dragging = false;
|
||||
// hide empty
|
||||
$('.cms_dragbar-empty-wrapper').hide();
|
||||
|
||||
// cancel if isAllowed returns false
|
||||
if(!that.state) return false;
|
||||
|
||||
// handle dropped event
|
||||
if(dropped) {
|
||||
droparea.prepend(ui.item);
|
||||
dropped = false;
|
||||
}
|
||||
|
||||
// we pass the id to the updater which checks within the backend the correct place
|
||||
//var id = ui.item.attr('class').replace('cms_draggable cms_draggable-', '');
|
||||
var id = that.getId(ui.item);
|
||||
var plugin = $('.cms_plugin-' + id);
|
||||
|
||||
// check if we copy/paste a plugin or not
|
||||
if(plugin.closest('.cms_clipboard').length) {
|
||||
plugin.trigger('cms.plugin.update');
|
||||
} else {
|
||||
plugin.trigger('cms.plugins.update');
|
||||
}
|
||||
|
||||
// reset placeholder without entries
|
||||
$('.cms_draggables').each(function () {
|
||||
if($(this).children().length === 0) {
|
||||
$(this).hide();
|
||||
}
|
||||
});
|
||||
},
|
||||
'isAllowed': function(placeholder, placeholderParent, originalItem) {
|
||||
// cancel if action is excecuted
|
||||
if(CMS.API.locked) return false;
|
||||
// getting restriction array
|
||||
var bounds = [];
|
||||
// save original state events
|
||||
var original = $('.cms_plugin-' + that.getId(originalItem));
|
||||
// cancel if item has no settings
|
||||
if(original.length === 0 || original.data('settings') === null) return false;
|
||||
var type = original.data('settings').plugin_type;
|
||||
// prepare variables for bound
|
||||
var holderId = that.getId(placeholder.closest('.cms_dragarea'));
|
||||
var holder = $('.cms_placeholder-' + holderId);
|
||||
var plugin = $('.cms_plugin-' + that.getId(placeholder.closest('.cms_draggable')));
|
||||
|
||||
// now set the correct bounds
|
||||
if(holder.length) bounds = holder.data('settings').plugin_restriction;
|
||||
if(plugin.length) bounds = plugin.data('settings').plugin_restriction;
|
||||
if(dropzone) bounds = dropzone.data('settings').plugin_restriction;
|
||||
|
||||
// if parent has class disabled, dissalow drop
|
||||
if(placeholder.parent().hasClass('cms_draggable-disabled')) return false;
|
||||
|
||||
// if restrictions is still empty, proceed
|
||||
that.state = (bounds.length <= 0 || $.inArray(type, bounds) !== -1) ? true : false;
|
||||
|
||||
return that.state;
|
||||
}
|
||||
});
|
||||
|
||||
// attach escape event to cancel dragging
|
||||
$(document).bind('keyup.cms', function(e, cancel){
|
||||
if(e.keyCode === 27 || cancel) {
|
||||
that.state = false;
|
||||
that.sortables.sortable('cancel');
|
||||
}
|
||||
});
|
||||
|
||||
// define droppable helpers
|
||||
this.dropareas.droppable({
|
||||
'greedy': true,
|
||||
'accept': '.cms_draggable',
|
||||
'tolerance': 'pointer',
|
||||
'activeClass': 'cms_draggable-allowed',
|
||||
'hoverClass': 'cms_draggable-hover-allowed',
|
||||
'over': function (event) {
|
||||
dropzone = $('.cms_placeholder-' + that.getId($(event.target).parent().prev()));
|
||||
timer = setInterval(function () {
|
||||
// reset other empty placeholders
|
||||
$('.cms_dragbar-empty').removeClass('cms_draggable-disallowed');
|
||||
if(that.state) {
|
||||
$(event.target).removeClass('cms_draggable-disallowed');
|
||||
} else {
|
||||
$(event.target).addClass('cms_draggable-disallowed');
|
||||
}
|
||||
}, 10);
|
||||
},
|
||||
'out': function (event) {
|
||||
dropzone = null;
|
||||
$(event.target).removeClass('cms_draggable-disallowed');
|
||||
clearInterval(timer);
|
||||
},
|
||||
'drop': function (event) {
|
||||
dropped = true;
|
||||
droparea = $(event.target).parent().nextAll('.cms_draggables').first();
|
||||
clearInterval(timer);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
});
|
||||
})(CMS.$);
|
||||
512
static/cms/js/modules/cms.toolbar.js
Normal file
|
|
@ -0,0 +1,512 @@
|
|||
/*##################################################|*/
|
||||
/* #CMS# */
|
||||
(function($) {
|
||||
// CMS.$ will be passed for $
|
||||
$(document).ready(function () {
|
||||
/*!
|
||||
* Toolbar
|
||||
* Handles all features related to the toolbar
|
||||
*/
|
||||
CMS.Toolbar = new CMS.Class({
|
||||
|
||||
implement: [CMS.API.Helpers],
|
||||
|
||||
options: {
|
||||
'preventSwitch': false,
|
||||
'preventSwitchMessage': 'Switching is disabled.',
|
||||
'messageDelay': 2000
|
||||
},
|
||||
|
||||
initialize: function (options) {
|
||||
this.container = $('#cms_toolbar');
|
||||
this.options = $.extend(true, {}, this.options, options);
|
||||
this.config = CMS.config;
|
||||
this.settings = CMS.settings;
|
||||
|
||||
// elements
|
||||
this.body = $('html');
|
||||
this.toolbar = this.container.find('.cms_toolbar').hide();
|
||||
this.toolbarTrigger = this.container.find('.cms_toolbar-trigger');
|
||||
this.navigations = this.container.find('.cms_toolbar-item-navigation');
|
||||
this.buttons = this.container.find('.cms_toolbar-item-buttons');
|
||||
this.switcher = this.container.find('.cms_toolbar-item_switch');
|
||||
this.messages = this.container.find('.cms_messages');
|
||||
this.screenBlock = this.container.find('.cms_screenblock');
|
||||
|
||||
// states
|
||||
this.click = 'click.cms';
|
||||
this.timer = function () {};
|
||||
this.lockToolbar = false;
|
||||
|
||||
// setup initial stuff
|
||||
this._setup();
|
||||
|
||||
// setup events
|
||||
this._events();
|
||||
},
|
||||
|
||||
// initial methods
|
||||
_setup: function () {
|
||||
// setup toolbar visibility, we need to reverse the options to set the correct state
|
||||
(this.settings.toolbar === 'expanded') ? this._showToolbar(0, true) : this._hideToolbar(0, true);
|
||||
|
||||
// hide publish button
|
||||
var publishBtn = $('.cms_btn-publish').parent();
|
||||
publishBtn.hide();
|
||||
if($('.cms_btn-publish-active').length) publishBtn.show();
|
||||
|
||||
// check if debug is true
|
||||
if(CMS.config.debug) this._debug();
|
||||
|
||||
// check if there are messages and display them
|
||||
if(CMS.config.messages) this.openMessage(CMS.config.messages);
|
||||
|
||||
// check if there are error messages and display them
|
||||
if(CMS.config.error) this.showError(CMS.config.error);
|
||||
|
||||
// enforce open state if user is not logged in but requests the toolbar
|
||||
if(!CMS.config.auth || CMS.config.settings.version !== this.settings.version) {
|
||||
this.toggleToolbar(true);
|
||||
this.settings = this.setSettings(CMS.config.settings);
|
||||
}
|
||||
|
||||
// should switcher indicate that there is an unpublished page?
|
||||
if(CMS.config.publisher) {
|
||||
this.openMessage(CMS.config.publisher, 'right');
|
||||
setInterval(function () {
|
||||
CMS.$('.cms_toolbar-item_switch').toggleClass('cms_toolbar-item_switch-highlight');
|
||||
}, this.options.messageDelay);
|
||||
}
|
||||
|
||||
// open sideframe if it was previously opened
|
||||
if(this.settings.sideframe.url) {
|
||||
var sideframe = new CMS.Sideframe();
|
||||
sideframe.open(this.settings.sideframe.url, false);
|
||||
}
|
||||
|
||||
// if there is a screenblock, do some resize magic
|
||||
if(this.screenBlock.length) this._screenBlock();
|
||||
|
||||
// add toolbar ready class to body and fire event
|
||||
this.body.addClass('cms-ready');
|
||||
$(document).trigger('cms-ready');
|
||||
},
|
||||
|
||||
_events: function () {
|
||||
var that = this;
|
||||
|
||||
// attach event to the trigger handler
|
||||
this.toolbarTrigger.bind(this.click, function (e) {
|
||||
e.preventDefault();
|
||||
that.toggleToolbar();
|
||||
});
|
||||
|
||||
// attach event to the navigation elements
|
||||
this.navigations.each(function () {
|
||||
var item = $(this);
|
||||
var lists = item.find('li');
|
||||
var root = 'cms_toolbar-item-navigation';
|
||||
var hover = 'cms_toolbar-item-navigation-hover';
|
||||
var disabled = 'cms_toolbar-item-navigation-disabled';
|
||||
var children = 'cms_toolbar-item-navigation-children';
|
||||
|
||||
// remove events from first level
|
||||
item.find('a').bind(that.click, function (e) {
|
||||
e.preventDefault();
|
||||
if($(this).attr('href') !== ''
|
||||
&& $(this).attr('href') !== '#'
|
||||
&& !$(this).parent().hasClass(disabled)
|
||||
&& !$(this).parent().hasClass(disabled)) {
|
||||
that._delegate($(this));
|
||||
reset();
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
||||
// handle click states
|
||||
lists.bind(that.click, function (e) {
|
||||
e.stopPropagation();
|
||||
var el = $(this);
|
||||
|
||||
// close if el is first item
|
||||
if(el.parent().hasClass(root) && el.hasClass(hover) || el.hasClass(disabled)) {
|
||||
reset();
|
||||
return false;
|
||||
} else {
|
||||
reset();
|
||||
el.addClass(hover);
|
||||
}
|
||||
|
||||
// activate hover selection
|
||||
item.find('> li').bind('mouseenter', function () {
|
||||
// cancel if item is already active
|
||||
if($(this).hasClass(hover)) return false;
|
||||
$(this).trigger(that.click);
|
||||
});
|
||||
|
||||
// create the document event
|
||||
$(document).bind(that.click, reset);
|
||||
});
|
||||
|
||||
// attach hover
|
||||
lists.find('li').bind('mouseenter mouseleave', function () {
|
||||
var el = $(this);
|
||||
var parent = el.closest('.cms_toolbar-item-navigation-children').add(el.parents('.cms_toolbar-item-navigation-children'));
|
||||
var hasChildren = el.hasClass(children) || parent.length;
|
||||
|
||||
// do not attach hover effect if disabled
|
||||
// cancel event if element has already hover class
|
||||
if(el.hasClass(disabled) || el.hasClass(hover)) return false;
|
||||
|
||||
// reset
|
||||
lists.find('li').removeClass(hover);
|
||||
|
||||
// add hover effect
|
||||
el.addClass(hover);
|
||||
|
||||
// handle children elements
|
||||
if(hasChildren) {
|
||||
el.find('> ul').show();
|
||||
// add parent class
|
||||
parent.addClass(hover);
|
||||
} else {
|
||||
lists.find('ul ul').hide();
|
||||
}
|
||||
|
||||
// Remove stale submenus
|
||||
el.siblings().find('> ul').hide();
|
||||
});
|
||||
|
||||
// fix leave event
|
||||
lists.find('> ul').bind('mouseleave', function () {
|
||||
lists.find('li').removeClass(hover);
|
||||
});
|
||||
|
||||
// removes classes and events
|
||||
function reset() {
|
||||
lists.removeClass(hover);
|
||||
lists.find('ul ul').hide();
|
||||
item.find('> li').unbind('mouseenter');
|
||||
$(document).unbind(that.click);
|
||||
}
|
||||
});
|
||||
|
||||
// attach event to the switcher elements
|
||||
this.switcher.each(function () {
|
||||
$(this).bind(that.click, function (e) {
|
||||
e.preventDefault();
|
||||
that._setSwitcher($(e.currentTarget));
|
||||
});
|
||||
});
|
||||
|
||||
// attach event for first page publish
|
||||
this.buttons.each(function () {
|
||||
var btn = $(this);
|
||||
|
||||
// in case the button has a data-rel attribute
|
||||
if(btn.find('a').attr('data-rel')) {
|
||||
btn.on('click', function (e) {
|
||||
e.preventDefault();
|
||||
that._delegate($(this).find('a'));
|
||||
})
|
||||
}
|
||||
|
||||
// in case of the publish button
|
||||
btn.find('.cms_publish-page').bind(that.click, function (e) {
|
||||
if(!confirm(that.config.lang.publish)) e.preventDefault();
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
// public methods
|
||||
toggleToolbar: function (show) {
|
||||
// overwrite state when provided
|
||||
if(show) this.settings.toolbar = 'collapsed';
|
||||
// toggle bar
|
||||
(this.settings.toolbar === 'collapsed') ? this._showToolbar(200) : this._hideToolbar(200);
|
||||
},
|
||||
|
||||
openMessage: function (msg, dir, delay, error) {
|
||||
// set toolbar freeze
|
||||
this._lock(true);
|
||||
|
||||
// add content to element
|
||||
this.messages.find('.cms_messages-inner').html(msg);
|
||||
|
||||
// clear timeout
|
||||
clearTimeout(this.timer);
|
||||
|
||||
// determine width
|
||||
var that = this;
|
||||
var width = 320;
|
||||
var height = this.messages.outerHeight(true);
|
||||
var top = this.toolbar.outerHeight(true);
|
||||
var close = this.messages.find('.cms_messages-close');
|
||||
close.hide();
|
||||
close.bind(this.click, function () {
|
||||
that.closeMessage();
|
||||
});
|
||||
|
||||
// set top to 0 if toolbar is collapsed
|
||||
if(this.settings.toolbar === 'collapsed') top = 0;
|
||||
|
||||
// do we need to add debug styles?
|
||||
if(this.config.debug) top = top + 5;
|
||||
|
||||
// set correct position and show
|
||||
this.messages.css('top', -height).show();
|
||||
|
||||
// error handling
|
||||
this.messages.removeClass('cms_messages-error');
|
||||
if(error) this.messages.addClass('cms_messages-error');
|
||||
|
||||
// dir should be left, center, right
|
||||
dir = dir || 'center';
|
||||
// set correct direction and animation
|
||||
switch(dir) {
|
||||
case 'left':
|
||||
this.messages.css({
|
||||
'top': top,
|
||||
'left': -width,
|
||||
'right': 'auto',
|
||||
'margin-left': 0
|
||||
});
|
||||
this.messages.animate({ 'left': 0 });
|
||||
break;
|
||||
case 'right':
|
||||
this.messages.css({
|
||||
'top': top,
|
||||
'right': -width,
|
||||
'left': 'auto',
|
||||
'margin-left': 0
|
||||
});
|
||||
this.messages.animate({ 'right': 0 });
|
||||
break;
|
||||
default:
|
||||
this.messages.css({
|
||||
'left': '50%',
|
||||
'right': 'auto',
|
||||
'margin-left': -(width / 2)
|
||||
});
|
||||
this.messages.animate({ 'top': top });
|
||||
}
|
||||
|
||||
// cancel autohide if delay is 0
|
||||
if(delay === 0) {
|
||||
close.show();
|
||||
return false
|
||||
}
|
||||
// add delay to hide
|
||||
this.timer = setTimeout(function () {
|
||||
that.closeMessage();
|
||||
}, delay || this.options.messageDelay);
|
||||
},
|
||||
|
||||
closeMessage: function () {
|
||||
this.messages.fadeOut(300);
|
||||
// unlock toolbar
|
||||
this._lock(false);
|
||||
},
|
||||
|
||||
openAjax: function (url, post, text, callback, onSuccess) {
|
||||
var that = this;
|
||||
|
||||
// check if we have a confirmation text
|
||||
var question = (text) ? confirm(text) : true;
|
||||
// cancel if question has been denied
|
||||
if(!question) return false;
|
||||
|
||||
// set loader
|
||||
this._loader(true);
|
||||
|
||||
$.ajax({
|
||||
'type': 'POST',
|
||||
'url': url,
|
||||
'data': (post) ? JSON.parse(post) : {},
|
||||
'success': function (response) {
|
||||
CMS.API.locked = false;
|
||||
|
||||
if(callback) {
|
||||
callback(that, response);
|
||||
that._loader(false);
|
||||
} else if(onSuccess) {
|
||||
CMS.API.Helpers.reloadBrowser(onSuccess, false, true);
|
||||
} else {
|
||||
// reload
|
||||
CMS.API.Helpers.reloadBrowser(false, false, true);
|
||||
}
|
||||
},
|
||||
'error': function (jqXHR) {
|
||||
CMS.API.locked = false;
|
||||
that.showError(jqXHR.response + ' | ' + jqXHR.status + ' ' + jqXHR.statusText);
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
showError: function (msg, reload) {
|
||||
this.openMessage(msg, 'center', 0, true);
|
||||
// force reload if param is passed
|
||||
if(reload) CMS.API.Helpers.reloadBrowser(false, this.options.messageDelay);
|
||||
},
|
||||
|
||||
// private methods
|
||||
_showToolbar: function (speed, init) {
|
||||
this.toolbarTrigger.addClass('cms_toolbar-trigger-expanded');
|
||||
this.toolbar.slideDown(speed);
|
||||
// animate html
|
||||
this.body.animate({ 'margin-top': (this.config.debug) ? 35 : 30 }, (init) ? 0 : speed, function () {
|
||||
$(this).addClass('cms-toolbar-expanded')
|
||||
});
|
||||
// set messages top to toolbar height
|
||||
this.messages.css('top', 31);
|
||||
// set new settings
|
||||
this.settings.toolbar = 'expanded';
|
||||
if(!init) this.settings = this.setSettings(this.settings);
|
||||
},
|
||||
|
||||
_hideToolbar: function (speed, init) {
|
||||
// cancel if sideframe is active
|
||||
if(this.lockToolbar) return false;
|
||||
|
||||
this.toolbarTrigger.removeClass('cms_toolbar-trigger-expanded');
|
||||
this.toolbar.slideUp(speed);
|
||||
// animate html
|
||||
this.body.removeClass('cms-toolbar-expanded').animate({ 'margin-top': (this.config.debug) ? 5 : 0 }, speed);
|
||||
// set messages top to 0
|
||||
this.messages.css('top', 0);
|
||||
// set new settings
|
||||
this.settings.toolbar = 'collapsed';
|
||||
if(!init) this.settings = this.setSettings(this.settings);
|
||||
},
|
||||
|
||||
_setSwitcher: function (el) {
|
||||
// save local vars
|
||||
var active = el.hasClass('cms_toolbar-item_switch-active');
|
||||
var anchor = el.find('a');
|
||||
var knob = el.find('.cms_toolbar-item_switch-knob');
|
||||
var duration = 300;
|
||||
|
||||
// prevent if switchopstion is passed
|
||||
if(this.options.preventSwitch) {
|
||||
this.openMessage(this.options.preventSwitchMessage, 'right');
|
||||
return false;
|
||||
}
|
||||
|
||||
// determin what to trigger
|
||||
if(active) {
|
||||
knob.animate({
|
||||
'right': anchor.outerWidth(true) - (knob.outerWidth(true) + 2)
|
||||
}, duration);
|
||||
// move anchor behind the knob
|
||||
anchor.css('z-index', 1).animate({
|
||||
'padding-top': 6,
|
||||
'padding-right': 14,
|
||||
'padding-bottom': 4,
|
||||
'padding-left': 28
|
||||
}, duration);
|
||||
} else {
|
||||
knob.animate({
|
||||
'left': anchor.outerWidth(true) - (knob.outerWidth(true) + 2)
|
||||
}, duration);
|
||||
// move anchor behind the knob
|
||||
anchor.css('z-index', 1).animate({
|
||||
'padding-top': 6,
|
||||
'padding-right': 28,
|
||||
'padding-bottom': 4,
|
||||
'padding-left': 14
|
||||
}, duration);
|
||||
}
|
||||
|
||||
// reload
|
||||
setTimeout(function () {
|
||||
window.location.href = anchor.attr('href');
|
||||
}, duration);
|
||||
},
|
||||
|
||||
_delegate: function (el) {
|
||||
// save local vars
|
||||
var target = el.data('rel');
|
||||
|
||||
switch(target) {
|
||||
case 'modal':
|
||||
var modal = new CMS.Modal({'onClose': el.data('on-close')});
|
||||
modal.open(el.attr('href'), el.data('name'));
|
||||
break;
|
||||
case 'message':
|
||||
this.openMessage(el.data('text'));
|
||||
break;
|
||||
case 'sideframe':
|
||||
var sideframe = new CMS.Sideframe({'onClose': el.data('on-close')});
|
||||
sideframe.open(el.attr('href'), true);
|
||||
break;
|
||||
case 'ajax':
|
||||
this.openAjax(el.attr('href'), JSON.stringify(el.data('post')), el.data('text'), null, el.data('on-success'));
|
||||
break;
|
||||
default:
|
||||
window.location.href = el.attr('href');
|
||||
}
|
||||
},
|
||||
|
||||
_lock: function (lock) {
|
||||
if(lock) {
|
||||
this.lockToolbar = true;
|
||||
// make button look disabled
|
||||
this.toolbarTrigger.css('opacity', 0.2);
|
||||
} else {
|
||||
this.lockToolbar = false;
|
||||
// make button look disabled
|
||||
this.toolbarTrigger.css('opacity', 1);
|
||||
}
|
||||
},
|
||||
|
||||
_loader: function (loader) {
|
||||
if(loader) {
|
||||
this.toolbarTrigger.addClass('cms_toolbar-loader');
|
||||
} else {
|
||||
this.toolbarTrigger.removeClass('cms_toolbar-loader');
|
||||
}
|
||||
},
|
||||
|
||||
_debug: function () {
|
||||
var that = this;
|
||||
var timeout = 1000;
|
||||
var timer = function () {};
|
||||
|
||||
// bind message event
|
||||
var debug = this.container.find('.cms_debug-bar');
|
||||
debug.bind('mouseenter mouseleave', function (e) {
|
||||
clearTimeout(timer);
|
||||
|
||||
if(e.type === 'mouseenter') {
|
||||
timer = setTimeout(function () {
|
||||
that.openMessage(that.config.lang.debug);
|
||||
}, timeout);
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
_screenBlock: function () {
|
||||
var interval = 20;
|
||||
var blocker = this.screenBlock;
|
||||
var sideframe = $('.cms_sideframe');
|
||||
|
||||
// automatically resize screenblock window according to given attributes
|
||||
$(window).on('resize.cms.screenblock', function () {
|
||||
var width = $(this).width() - sideframe.width();
|
||||
|
||||
blocker.css({
|
||||
'width': width,
|
||||
'height': $(window).height()
|
||||
});
|
||||
}).trigger('resize');
|
||||
|
||||
// set update interval
|
||||
setInterval(function () {
|
||||
$(window).trigger('resize.cms.screenblock');
|
||||
}, interval);
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
});
|
||||
})(CMS.$);
|
||||
14
static/cms/js/modules/jquery.ui.custom.js
vendored
Normal file
613
static/cms/js/modules/jquery.ui.nestedsortable.js
vendored
Normal file
|
|
@ -0,0 +1,613 @@
|
|||
/*
|
||||
* jQuery UI Nested Sortable
|
||||
* v 2.0 / 29 oct 2012
|
||||
* http://mjsarfatti.com/sandbox/nestedSortable
|
||||
*
|
||||
* Depends on:
|
||||
* jquery.ui.sortable.js 1.10+
|
||||
*
|
||||
* Copyright (c) 2010-2013 Manuele J Sarfatti
|
||||
* Licensed under the MIT License
|
||||
* http://www.opensource.org/licenses/mit-license.php
|
||||
*/
|
||||
|
||||
(function($) {
|
||||
|
||||
function isOverAxis( x, reference, size ) {
|
||||
return ( x > reference ) && ( x < ( reference + size ) );
|
||||
}
|
||||
|
||||
$.widget("mjs.nestedSortable", $.extend({}, $.ui.sortable.prototype, {
|
||||
|
||||
options: {
|
||||
doNotClear: false,
|
||||
expandOnHover: 700,
|
||||
isAllowed: function(placeholder, placeholderParent, originalItem) { return true; },
|
||||
isTree: false,
|
||||
listType: 'ol',
|
||||
maxLevels: 0,
|
||||
protectRoot: false,
|
||||
rootID: null,
|
||||
rtl: false,
|
||||
startCollapsed: false,
|
||||
tabSize: 20,
|
||||
|
||||
branchClass: 'mjs-nestedSortable-branch',
|
||||
collapsedClass: 'mjs-nestedSortable-collapsed',
|
||||
disableNestingClass: 'mjs-nestedSortable-no-nesting',
|
||||
errorClass: 'mjs-nestedSortable-error',
|
||||
expandedClass: 'mjs-nestedSortable-expanded',
|
||||
hoveringClass: 'mjs-nestedSortable-hovering',
|
||||
leafClass: 'mjs-nestedSortable-leaf'
|
||||
},
|
||||
|
||||
_create: function() {
|
||||
this.element.data('ui-sortable', this.element.data('mjs-nestedSortable'));
|
||||
|
||||
// mjs - prevent browser from freezing if the HTML is not correct
|
||||
if (!this.element.is(this.options.listType))
|
||||
throw new Error('nestedSortable: Please check that the listType option is set to your actual list type');
|
||||
|
||||
// mjs - force 'intersect' tolerance method if we have a tree with expanding/collapsing functionality
|
||||
if (this.options.isTree && this.options.expandOnHover) {
|
||||
this.options.tolerance = 'intersect';
|
||||
}
|
||||
|
||||
$.ui.sortable.prototype._create.apply(this, arguments);
|
||||
|
||||
// mjs - prepare the tree by applying the right classes (the CSS is responsible for actual hide/show functionality)
|
||||
if (this.options.isTree) {
|
||||
var self = this;
|
||||
$(this.items).each(function() {
|
||||
var $li = this.item;
|
||||
if ($li.children(self.options.listType).length) {
|
||||
$li.addClass(self.options.branchClass);
|
||||
// expand/collapse class only if they have children
|
||||
if (self.options.startCollapsed) $li.addClass(self.options.collapsedClass);
|
||||
else $li.addClass(self.options.expandedClass);
|
||||
} else {
|
||||
$li.addClass(self.options.leafClass);
|
||||
}
|
||||
})
|
||||
}
|
||||
},
|
||||
|
||||
_destroy: function() {
|
||||
this.element
|
||||
.removeData("mjs-nestedSortable")
|
||||
.removeData("ui-sortable");
|
||||
return $.ui.sortable.prototype._destroy.apply(this, arguments);
|
||||
},
|
||||
|
||||
_mouseDrag: function(event) {
|
||||
var i, item, itemElement, intersection,
|
||||
o = this.options,
|
||||
scrolled = false;
|
||||
|
||||
//Compute the helpers position
|
||||
this.position = this._generatePosition(event);
|
||||
this.positionAbs = this._convertPositionTo("absolute");
|
||||
|
||||
if (!this.lastPositionAbs) {
|
||||
this.lastPositionAbs = this.positionAbs;
|
||||
}
|
||||
|
||||
//Do scrolling
|
||||
if(this.options.scroll) {
|
||||
if(this.scrollParent[0] != document && this.scrollParent[0].tagName != 'HTML') {
|
||||
|
||||
if((this.overflowOffset.top + this.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity) {
|
||||
this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop + o.scrollSpeed;
|
||||
} else if(event.pageY - this.overflowOffset.top < o.scrollSensitivity) {
|
||||
this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop - o.scrollSpeed;
|
||||
}
|
||||
|
||||
if((this.overflowOffset.left + this.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity) {
|
||||
this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft + o.scrollSpeed;
|
||||
} else if(event.pageX - this.overflowOffset.left < o.scrollSensitivity) {
|
||||
this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft - o.scrollSpeed;
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
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(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(this, event);
|
||||
}
|
||||
|
||||
//Regenerate the absolute position used for position checks
|
||||
this.positionAbs = this._convertPositionTo("absolute");
|
||||
|
||||
// mjs - find the top offset before rearrangement,
|
||||
var previousTopOffset = this.placeholder.offset().top;
|
||||
|
||||
//Set the helper position
|
||||
if(!this.options.axis || this.options.axis !== "y") {
|
||||
this.helper[0].style.left = this.position.left+"px";
|
||||
}
|
||||
if(!this.options.axis || this.options.axis !== "x") {
|
||||
this.helper[0].style.top = this.position.top+"px";
|
||||
}
|
||||
|
||||
// mjs - check and reset hovering state at each cycle
|
||||
this.hovering = this.hovering ? this.hovering : null;
|
||||
this.mouseentered = this.mouseentered ? this.mouseentered : false;
|
||||
|
||||
// mjs - let's start caching some variables
|
||||
var parentItem = (this.placeholder[0].parentNode.parentNode &&
|
||||
$(this.placeholder[0].parentNode.parentNode).closest('.ui-sortable').length)
|
||||
? $(this.placeholder[0].parentNode.parentNode)
|
||||
: null,
|
||||
level = this._getLevel(this.placeholder),
|
||||
childLevels = this._getChildLevels(this.helper);
|
||||
|
||||
var newList = document.createElement(o.listType);
|
||||
|
||||
//Rearrange
|
||||
for (i = this.items.length - 1; i >= 0; i--) {
|
||||
|
||||
//Cache variables and intersection, continue if no intersection
|
||||
item = this.items[i];
|
||||
itemElement = item.item[0];
|
||||
intersection = this._intersectsWithPointer(item);
|
||||
if (!intersection) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Only put the placeholder inside the current Container, skip all
|
||||
// items form other containers. This works because when moving
|
||||
// an item from one container to another the
|
||||
// currentContainer is switched before the placeholder is moved.
|
||||
//
|
||||
// Without this moving items in "sub-sortables" can cause the placeholder to jitter
|
||||
// beetween the outer and inner container.
|
||||
if (item.instance !== this.currentContainer) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// cannot intersect with itself
|
||||
// no useless actions that have been done before
|
||||
// no action if the item moved is the parent of the item checked
|
||||
if (itemElement !== this.currentItem[0] &&
|
||||
this.placeholder[intersection === 1 ? "next" : "prev"]()[0] !== itemElement &&
|
||||
!$.contains(this.placeholder[0], itemElement) &&
|
||||
(this.options.type === "semi-dynamic" ? !$.contains(this.element[0], itemElement) : true)
|
||||
) {
|
||||
|
||||
// mjs - we are intersecting an element: trigger the mouseenter event and store this state
|
||||
if (!this.mouseentered) {
|
||||
$(itemElement).mouseenter();
|
||||
this.mouseentered = true;
|
||||
}
|
||||
|
||||
// mjs - if the element has children and they are hidden, show them after a delay (CSS responsible)
|
||||
if (o.isTree && $(itemElement).hasClass(o.collapsedClass) && o.expandOnHover) {
|
||||
if (!this.hovering) {
|
||||
$(itemElement).addClass(o.hoveringClass);
|
||||
var self = this;
|
||||
this.hovering = window.setTimeout(function() {
|
||||
$(itemElement).removeClass(o.collapsedClass).addClass(o.expandedClass);
|
||||
self.refreshPositions();
|
||||
self._trigger("expand", event, self._uiHash());
|
||||
}, o.expandOnHover);
|
||||
}
|
||||
}
|
||||
|
||||
this.direction = intersection == 1 ? "down" : "up";
|
||||
|
||||
// mjs - rearrange the elements and reset timeouts and hovering state
|
||||
if (this.options.tolerance == "pointer" || this._intersectsWithSides(item)) {
|
||||
$(itemElement).mouseleave();
|
||||
this.mouseentered = false;
|
||||
$(itemElement).removeClass(o.hoveringClass);
|
||||
this.hovering && window.clearTimeout(this.hovering);
|
||||
this.hovering = null;
|
||||
|
||||
// mjs - do not switch container if it's a root item and 'protectRoot' is true
|
||||
// or if it's not a root item but we are trying to make it root
|
||||
if (o.protectRoot
|
||||
&& ! (this.currentItem[0].parentNode == this.element[0] // it's a root item
|
||||
&& itemElement.parentNode != this.element[0]) // it's intersecting a non-root item
|
||||
) {
|
||||
if (this.currentItem[0].parentNode != this.element[0]
|
||||
&& itemElement.parentNode == this.element[0]
|
||||
) {
|
||||
|
||||
if ( ! $(itemElement).children(o.listType).length) {
|
||||
itemElement.appendChild(newList);
|
||||
o.isTree && $(itemElement).removeClass(o.leafClass).addClass(o.branchClass + ' ' + o.expandedClass);
|
||||
}
|
||||
|
||||
var a = this.direction === "down" ? $(itemElement).prev().children(o.listType) : $(itemElement).children(o.listType);
|
||||
if (a[0] !== undefined) {
|
||||
this._rearrange(event, null, a);
|
||||
}
|
||||
|
||||
} else {
|
||||
this._rearrange(event, item);
|
||||
}
|
||||
} else if ( ! o.protectRoot) {
|
||||
this._rearrange(event, item);
|
||||
}
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
|
||||
// Clear emtpy ul's/ol's
|
||||
this._clearEmpty(itemElement);
|
||||
|
||||
this._trigger("change", event, this._uiHash());
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// mjs - to find the previous sibling in the list, keep backtracking until we hit a valid list item.
|
||||
var previousItem = this.placeholder[0].previousSibling ? $(this.placeholder[0].previousSibling) : null;
|
||||
if (previousItem != null) {
|
||||
while (previousItem[0].nodeName.toLowerCase() != $(o.listType)[0].nodeName.toLowerCase() || previousItem[0] == this.currentItem[0] || previousItem[0] == this.helper[0]) {
|
||||
if (previousItem[0].previousSibling) {
|
||||
previousItem = $(previousItem[0].previousSibling);
|
||||
} else {
|
||||
previousItem = null;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// mjs - to find the next sibling in the list, keep stepping forward until we hit a valid list item.
|
||||
var nextItem = this.placeholder[0].nextSibling ? $(this.placeholder[0].nextSibling) : null;
|
||||
if (nextItem != null) {
|
||||
while (nextItem[0].nodeName.toLowerCase() != $(o.listType)[0].nodeName.toLowerCase() || nextItem[0] == this.currentItem[0] || nextItem[0] == this.helper[0]) {
|
||||
if (nextItem[0].nextSibling) {
|
||||
nextItem = $(nextItem[0].nextSibling);
|
||||
} else {
|
||||
nextItem = null;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
this.beyondMaxLevels = 0;
|
||||
|
||||
// mjs - if the item is moved to the left, send it one level up but only if it's at the bottom of the list
|
||||
if (parentItem != null
|
||||
&& nextItem == null
|
||||
&& ! (o.protectRoot && parentItem[0].parentNode == this.element[0])
|
||||
&&
|
||||
(o.rtl && (this.positionAbs.left + this.helper.outerWidth() > parentItem.offset().left + parentItem.outerWidth())
|
||||
|| ! o.rtl && (this.positionAbs.left < parentItem.offset().left))
|
||||
) {
|
||||
|
||||
parentItem.after(this.placeholder[0]);
|
||||
if (o.isTree && parentItem.children(o.listItem).children(o.listItem + ':visible:not(.ui-sortable-helper)').length < 1) {
|
||||
parentItem.removeClass(this.options.branchClass + ' ' + this.options.expandedClass)
|
||||
.addClass(this.options.leafClass);
|
||||
}
|
||||
this._clearEmpty(parentItem[0]);
|
||||
this._trigger("change", event, this._uiHash());
|
||||
}
|
||||
// mjs - if the item is below a sibling and is moved to the right, make it a child of that sibling
|
||||
else if (previousItem != null
|
||||
&& ! previousItem.hasClass(o.disableNestingClass)
|
||||
&&
|
||||
(previousItem.children(o.listType).length && previousItem.children(o.listType).is(':visible')
|
||||
|| ! previousItem.children(o.listType).length)
|
||||
&& ! (o.protectRoot && this.currentItem[0].parentNode == this.element[0])
|
||||
&&
|
||||
(o.rtl && (this.positionAbs.left + this.helper.outerWidth() < previousItem.offset().left + previousItem.outerWidth() - o.tabSize)
|
||||
|| ! o.rtl && (this.positionAbs.left > previousItem.offset().left + o.tabSize))
|
||||
) {
|
||||
|
||||
this._isAllowed(previousItem, level, level+childLevels+1);
|
||||
|
||||
if (!previousItem.children(o.listType).length) {
|
||||
previousItem[0].appendChild(newList);
|
||||
o.isTree && previousItem.removeClass(o.leafClass).addClass(o.branchClass + ' ' + o.expandedClass);
|
||||
}
|
||||
|
||||
// mjs - if this item is being moved from the top, add it to the top of the list.
|
||||
if (previousTopOffset && (previousTopOffset <= previousItem.offset().top)) {
|
||||
previousItem.children(o.listType).prepend(this.placeholder);
|
||||
}
|
||||
// mjs - otherwise, add it to the bottom of the list.
|
||||
else if(previousItem.children(o.listType).length) {
|
||||
previousItem.children(o.listType)[0].appendChild(this.placeholder[0]);
|
||||
}
|
||||
|
||||
this._trigger("change", event, this._uiHash());
|
||||
}
|
||||
else {
|
||||
this._isAllowed(parentItem, level, level+childLevels);
|
||||
}
|
||||
|
||||
//Post events to containers
|
||||
this._contactContainers(event);
|
||||
|
||||
//Interconnect with droppables
|
||||
if($.ui.ddmanager) {
|
||||
$.ui.ddmanager.drag(this, event);
|
||||
}
|
||||
|
||||
//Call callbacks
|
||||
this._trigger('sort', event, this._uiHash());
|
||||
|
||||
this.lastPositionAbs = this.positionAbs;
|
||||
return false;
|
||||
|
||||
},
|
||||
|
||||
_mouseStop: function(event, noPropagation) {
|
||||
|
||||
// mjs - if the item is in a position not allowed, send it back
|
||||
if (this.beyondMaxLevels) {
|
||||
|
||||
this.placeholder.removeClass(this.options.errorClass);
|
||||
|
||||
if (this.domPosition.prev) {
|
||||
$(this.domPosition.prev).after(this.placeholder);
|
||||
} else {
|
||||
$(this.domPosition.parent).prepend(this.placeholder);
|
||||
}
|
||||
|
||||
this._trigger("revert", event, this._uiHash());
|
||||
|
||||
}
|
||||
|
||||
|
||||
// mjs - clear the hovering timeout, just to be sure
|
||||
$('.'+this.options.hoveringClass).mouseleave().removeClass(this.options.hoveringClass);
|
||||
this.mouseentered = false;
|
||||
this.hovering && window.clearTimeout(this.hovering);
|
||||
this.hovering = null;
|
||||
|
||||
$.ui.sortable.prototype._mouseStop.apply(this, arguments);
|
||||
|
||||
},
|
||||
|
||||
// mjs - this function is slightly modified to make it easier to hover over a collapsed element and have it expand
|
||||
_intersectsWithSides: function(item) {
|
||||
|
||||
var half = this.options.isTree ? .8 : .5;
|
||||
|
||||
var isOverBottomHalf = isOverAxis(this.positionAbs.top + this.offset.click.top, item.top + (item.height*half), item.height),
|
||||
isOverTopHalf = isOverAxis(this.positionAbs.top + this.offset.click.top, item.top - (item.height*half), item.height),
|
||||
isOverRightHalf = isOverAxis(this.positionAbs.left + this.offset.click.left, item.left + (item.width/2), item.width),
|
||||
verticalDirection = this._getDragVerticalDirection(),
|
||||
horizontalDirection = this._getDragHorizontalDirection();
|
||||
|
||||
if (this.floating && horizontalDirection) {
|
||||
return ((horizontalDirection == "right" && isOverRightHalf) || (horizontalDirection == "left" && !isOverRightHalf));
|
||||
} else {
|
||||
return verticalDirection && ((verticalDirection == "down" && isOverBottomHalf) || (verticalDirection == "up" && isOverTopHalf));
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
_contactContainers: function(event) {
|
||||
|
||||
if (this.options.protectRoot && this.currentItem[0].parentNode == this.element[0] ) {
|
||||
return;
|
||||
}
|
||||
|
||||
$.ui.sortable.prototype._contactContainers.apply(this, arguments);
|
||||
|
||||
},
|
||||
|
||||
_clear: function(event, noPropagation) {
|
||||
|
||||
$.ui.sortable.prototype._clear.apply(this, arguments);
|
||||
|
||||
// mjs - clean last empty ul/ol
|
||||
for (var i = this.items.length - 1; i >= 0; i--) {
|
||||
var item = this.items[i].item[0];
|
||||
this._clearEmpty(item);
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
serialize: function(options) {
|
||||
|
||||
var o = $.extend({}, this.options, options),
|
||||
items = this._getItemsAsjQuery(o && o.connected),
|
||||
str = [];
|
||||
|
||||
$(items).each(function() {
|
||||
var res = ($(o.item || this).attr(o.attribute || 'id') || '')
|
||||
.match(o.expression || (/(.+)[-=_](.+)/)),
|
||||
pid = ($(o.item || this).parent(o.listType)
|
||||
.parent(o.items)
|
||||
.attr(o.attribute || 'id') || '')
|
||||
.match(o.expression || (/(.+)[-=_](.+)/));
|
||||
|
||||
if (res) {
|
||||
str.push(((o.key || res[1]) + '[' + (o.key && o.expression ? res[1] : res[2]) + ']')
|
||||
+ '='
|
||||
+ (pid ? (o.key && o.expression ? pid[1] : pid[2]) : o.rootID));
|
||||
}
|
||||
});
|
||||
|
||||
if(!str.length && o.key) {
|
||||
str.push(o.key + '=');
|
||||
}
|
||||
|
||||
return str.join('&');
|
||||
|
||||
},
|
||||
|
||||
toHierarchy: function(options) {
|
||||
|
||||
var o = $.extend({}, this.options, options),
|
||||
sDepth = o.startDepthCount || 0,
|
||||
ret = [];
|
||||
|
||||
$(this.element).children(o.items).each(function () {
|
||||
var level = _recursiveItems(this);
|
||||
ret.push(level);
|
||||
});
|
||||
|
||||
return ret;
|
||||
|
||||
function _recursiveItems(item) {
|
||||
var id = ($(item).attr(o.attribute || 'id') || '').match(o.expression || (/(.+)[-=_](.+)/));
|
||||
if (id) {
|
||||
var currentItem = {"id" : id[2]};
|
||||
if ($(item).children(o.listType).children(o.items).length > 0) {
|
||||
currentItem.children = [];
|
||||
$(item).children(o.listType).children(o.items).each(function() {
|
||||
var level = _recursiveItems(this);
|
||||
currentItem.children.push(level);
|
||||
});
|
||||
}
|
||||
return currentItem;
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
toArray: function(options) {
|
||||
|
||||
var o = $.extend({}, this.options, options),
|
||||
sDepth = o.startDepthCount || 0,
|
||||
ret = [],
|
||||
left = 1;
|
||||
|
||||
if (!o.excludeRoot) {
|
||||
ret.push({
|
||||
"item_id": o.rootID,
|
||||
"parent_id": null,
|
||||
"depth": sDepth,
|
||||
"left": left,
|
||||
"right": ($(o.items, this.element).length + 1) * 2
|
||||
});
|
||||
left++
|
||||
}
|
||||
|
||||
$(this.element).children(o.items).each(function () {
|
||||
left = _recursiveArray(this, sDepth + 1, left);
|
||||
});
|
||||
|
||||
ret = ret.sort(function(a,b){ return (a.left - b.left); });
|
||||
|
||||
return ret;
|
||||
|
||||
function _recursiveArray(item, depth, left) {
|
||||
|
||||
var right = left + 1,
|
||||
id,
|
||||
pid;
|
||||
|
||||
if ($(item).children(o.listType).children(o.items).length > 0) {
|
||||
depth ++;
|
||||
$(item).children(o.listType).children(o.items).each(function () {
|
||||
right = _recursiveArray($(this), depth, right);
|
||||
});
|
||||
depth --;
|
||||
}
|
||||
|
||||
id = ($(item).attr(o.attribute || 'id')).match(o.expression || (/(.+)[-=_](.+)/));
|
||||
|
||||
if (depth === sDepth + 1) {
|
||||
pid = o.rootID;
|
||||
} else {
|
||||
var parentItem = ($(item).parent(o.listType)
|
||||
.parent(o.items)
|
||||
.attr(o.attribute || 'id'))
|
||||
.match(o.expression || (/(.+)[-=_](.+)/));
|
||||
pid = parentItem[2];
|
||||
}
|
||||
|
||||
if (id) {
|
||||
ret.push({"item_id": id[2], "parent_id": pid, "depth": depth, "left": left, "right": right});
|
||||
}
|
||||
|
||||
left = right + 1;
|
||||
return left;
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
_clearEmpty: function(item) {
|
||||
var o = this.options;
|
||||
|
||||
var emptyList = $(item).children(o.listType);
|
||||
|
||||
if (emptyList.length && !emptyList.children().length && !o.doNotClear) {
|
||||
o.isTree && $(item).removeClass(o.branchClass + ' ' + o.expandedClass).addClass(o.leafClass);
|
||||
emptyList.remove();
|
||||
} else if (o.isTree && emptyList.length && emptyList.children().length && emptyList.is(':visible')) {
|
||||
$(item).removeClass(o.leafClass).addClass(o.branchClass + ' ' + o.expandedClass);
|
||||
} else if (o.isTree && emptyList.length && emptyList.children().length && !emptyList.is(':visible')) {
|
||||
$(item).removeClass(o.leafClass).addClass(o.branchClass + ' ' + o.collapsedClass);
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
_getLevel: function(item) {
|
||||
|
||||
var level = 1;
|
||||
|
||||
if (this.options.listType) {
|
||||
var list = item.closest(this.options.listType);
|
||||
while (list && list.length > 0 &&
|
||||
!list.is('.ui-sortable')) {
|
||||
level++;
|
||||
list = list.parent().closest(this.options.listType);
|
||||
}
|
||||
}
|
||||
|
||||
return level;
|
||||
},
|
||||
|
||||
_getChildLevels: function(parent, depth) {
|
||||
var self = this,
|
||||
o = this.options,
|
||||
result = 0;
|
||||
depth = depth || 0;
|
||||
|
||||
$(parent).children(o.listType).children(o.items).each(function (index, child) {
|
||||
result = Math.max(self._getChildLevels(child, depth + 1), result);
|
||||
});
|
||||
|
||||
return depth ? result + 1 : result;
|
||||
},
|
||||
|
||||
_isAllowed: function(parentItem, level, levels) {
|
||||
var o = this.options,
|
||||
maxLevels = this.placeholder.closest('.ui-sortable').nestedSortable('option', 'maxLevels'); // this takes into account the maxLevels set to the recipient list
|
||||
|
||||
// mjs - is the root protected?
|
||||
// mjs - are we nesting too deep?
|
||||
if ( ! o.isAllowed(this.placeholder, parentItem, this.currentItem)) {
|
||||
this.placeholder.addClass(o.errorClass);
|
||||
if (maxLevels < levels && maxLevels != 0) {
|
||||
this.beyondMaxLevels = levels - maxLevels;
|
||||
} else {
|
||||
this.beyondMaxLevels = 1;
|
||||
}
|
||||
} else {
|
||||
if (maxLevels < levels && maxLevels != 0) {
|
||||
this.placeholder.addClass(o.errorClass);
|
||||
this.beyondMaxLevels = levels - maxLevels;
|
||||
} else {
|
||||
this.placeholder.removeClass(o.errorClass);
|
||||
this.beyondMaxLevels = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}));
|
||||
|
||||
$.mjs.nestedSortable.prototype.options = $.extend({}, $.ui.sortable.prototype.options, $.mjs.nestedSortable.prototype.options);
|
||||
})(jQuery);
|
||||
18
static/cms/js/select2/LICENSE
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
Copyright 2014 Igor Vaynberg
|
||||
|
||||
Version: @@ver@@ Timestamp: @@timestamp@@
|
||||
|
||||
This software is licensed under the Apache License, Version 2.0 (the "Apache License") or the GNU
|
||||
General Public License version 2 (the "GPL License"). You may choose either license to govern your
|
||||
use of this software only upon the condition that you accept all of the terms of either the Apache
|
||||
License or the GPL License.
|
||||
|
||||
You may obtain a copy of the Apache License and the GPL License at:
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
http://www.gnu.org/licenses/gpl-2.0.html
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software distributed under the Apache License
|
||||
or the GPL Licesnse is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
|
||||
either express or implied. See the Apache License and the GPL License for the specific language governing
|
||||
permissions and limitations under the Apache License and the GPL License.
|
||||
99
static/cms/js/select2/README.md
Normal file
|
|
@ -0,0 +1,99 @@
|
|||
Select2
|
||||
=======
|
||||
|
||||
Select2 is a jQuery-based replacement for select boxes. It supports searching, remote data sets, and infinite scrolling of results.
|
||||
|
||||
To get started, checkout examples and documentation at http://ivaynberg.github.com/select2
|
||||
|
||||
Use cases
|
||||
---------
|
||||
|
||||
* Enhancing native selects with search.
|
||||
* Enhancing native selects with a better multi-select interface.
|
||||
* Loading data from JavaScript: easily load items via ajax and have them searchable.
|
||||
* Nesting optgroups: native selects only support one level of nested. Select2 does not have this restriction.
|
||||
* Tagging: ability to add new items on the fly.
|
||||
* Working with large, remote datasets: ability to partially load a dataset based on the search term.
|
||||
* Paging of large datasets: easy support for loading more pages when the results are scrolled to the end.
|
||||
* Templating: support for custom rendering of results and selections.
|
||||
|
||||
Browser compatibility
|
||||
---------------------
|
||||
* IE 8+
|
||||
* Chrome 8+
|
||||
* Firefox 10+
|
||||
* Safari 3+
|
||||
* Opera 10.6+
|
||||
|
||||
Usage
|
||||
-----
|
||||
You can source Select2 directly from a [CDN like JSDliver](http://www.jsdelivr.com/#!select2), [download it from this GitHub repo](https://github.com/ivaynberg/select2/tags), or use one of the integrations below.
|
||||
|
||||
Integrations
|
||||
------------
|
||||
|
||||
* [Wicket-Select2](https://github.com/ivaynberg/wicket-select2) (Java / [Apache Wicket](http://wicket.apache.org))
|
||||
* [select2-rails](https://github.com/argerim/select2-rails) (Ruby on Rails)
|
||||
* [AngularUI](http://angular-ui.github.com/#directives-select2) ([AngularJS](http://angularjs.org))
|
||||
* [Django](https://github.com/applegrew/django-select2)
|
||||
* [Symfony](https://github.com/19Gerhard85/sfSelect2WidgetsPlugin)
|
||||
* [Symfony2](https://github.com/avocode/FormExtensions)
|
||||
* [Bootstrap 2](https://github.com/t0m/select2-bootstrap-css) and [Bootstrap 3](https://github.com/t0m/select2-bootstrap-css/tree/bootstrap3) (CSS skins)
|
||||
* [Meteor](https://github.com/nate-strauser/meteor-select2) (modern reactive JavaScript framework; + [Bootstrap 3 skin](https://github.com/esperadomedia/meteor-select2-bootstrap3-css/))
|
||||
* [Meteor](https://jquery-select2.meteor.com)
|
||||
* [Yii 2.x](http://demos.krajee.com/widgets#select2)
|
||||
* [Yii 1.x](https://github.com/tonybolzan/yii-select2)
|
||||
* [AtmosphereJS](https://atmospherejs.com/package/jquery-select2)
|
||||
|
||||
### Example Integrations
|
||||
|
||||
* [Knockout.js](https://github.com/ivaynberg/select2/wiki/Knockout.js-Integration)
|
||||
* [Socket.IO](https://github.com/ivaynberg/select2/wiki/Socket.IO-Integration)
|
||||
* [PHP](https://github.com/ivaynberg/select2/wiki/PHP-Example)
|
||||
* [.Net MVC] (https://github.com/ivaynberg/select2/wiki/.Net-MVC-Example)
|
||||
|
||||
Internationalization (i18n)
|
||||
---------------------------
|
||||
|
||||
Select2 supports multiple languages by simply including the right language JS
|
||||
file (`select2_locale_it.js`, `select2_locale_nl.js`, etc.) after `select2.js`.
|
||||
|
||||
Missing a language? Just copy `select2_locale_en.js.template`, translate
|
||||
it, and make a pull request back to Select2 here on GitHub.
|
||||
|
||||
Bug tracker
|
||||
-----------
|
||||
|
||||
Have a bug? Please create an issue here on GitHub!
|
||||
|
||||
https://github.com/ivaynberg/select2/issues
|
||||
|
||||
Mailing list
|
||||
------------
|
||||
|
||||
Have a question? Ask on our mailing list!
|
||||
|
||||
select2@googlegroups.com
|
||||
|
||||
https://groups.google.com/d/forum/select2
|
||||
|
||||
|
||||
Copyright and license
|
||||
---------------------
|
||||
|
||||
Copyright 2012 Igor Vaynberg
|
||||
|
||||
This software is licensed under the Apache License, Version 2.0 (the "Apache License") or the GNU
|
||||
General Public License version 2 (the "GPL License"). You may choose either license to govern your
|
||||
use of this software only upon the condition that you accept all of the terms of either the Apache
|
||||
License or the GPL License.
|
||||
|
||||
You may obtain a copy of the Apache License and the GPL License in the LICENSE file, or at:
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
http://www.gnu.org/licenses/gpl-2.0.html
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software distributed under the Apache License
|
||||
or the GPL License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
|
||||
either express or implied. See the Apache License and the GPL License for the specific language governing
|
||||
permissions and limitations under the Apache License and the GPL License.
|
||||
87
static/cms/js/select2/select2-bootstrap.css
vendored
Normal file
|
|
@ -0,0 +1,87 @@
|
|||
.form-control .select2-choice {
|
||||
border: 0;
|
||||
border-radius: 2px;
|
||||
}
|
||||
|
||||
.form-control .select2-choice .select2-arrow {
|
||||
border-radius: 0 2px 2px 0;
|
||||
}
|
||||
|
||||
.form-control.select2-container {
|
||||
height: auto !important;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.form-control.select2-container.select2-dropdown-open {
|
||||
border-color: #5897FB;
|
||||
border-radius: 3px 3px 0 0;
|
||||
}
|
||||
|
||||
.form-control .select2-container.select2-dropdown-open .select2-choices {
|
||||
border-radius: 3px 3px 0 0;
|
||||
}
|
||||
|
||||
.form-control.select2-container .select2-choices {
|
||||
border: 0 !important;
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
.control-group.warning .select2-container .select2-choice,
|
||||
.control-group.warning .select2-container .select2-choices,
|
||||
.control-group.warning .select2-container-active .select2-choice,
|
||||
.control-group.warning .select2-container-active .select2-choices,
|
||||
.control-group.warning .select2-dropdown-open.select2-drop-above .select2-choice,
|
||||
.control-group.warning .select2-dropdown-open.select2-drop-above .select2-choices,
|
||||
.control-group.warning .select2-container-multi.select2-container-active .select2-choices {
|
||||
border: 1px solid #C09853 !important;
|
||||
}
|
||||
|
||||
.control-group.warning .select2-container .select2-choice div {
|
||||
border-left: 1px solid #C09853 !important;
|
||||
background: #FCF8E3 !important;
|
||||
}
|
||||
|
||||
.control-group.error .select2-container .select2-choice,
|
||||
.control-group.error .select2-container .select2-choices,
|
||||
.control-group.error .select2-container-active .select2-choice,
|
||||
.control-group.error .select2-container-active .select2-choices,
|
||||
.control-group.error .select2-dropdown-open.select2-drop-above .select2-choice,
|
||||
.control-group.error .select2-dropdown-open.select2-drop-above .select2-choices,
|
||||
.control-group.error .select2-container-multi.select2-container-active .select2-choices {
|
||||
border: 1px solid #B94A48 !important;
|
||||
}
|
||||
|
||||
.control-group.error .select2-container .select2-choice div {
|
||||
border-left: 1px solid #B94A48 !important;
|
||||
background: #F2DEDE !important;
|
||||
}
|
||||
|
||||
.control-group.info .select2-container .select2-choice,
|
||||
.control-group.info .select2-container .select2-choices,
|
||||
.control-group.info .select2-container-active .select2-choice,
|
||||
.control-group.info .select2-container-active .select2-choices,
|
||||
.control-group.info .select2-dropdown-open.select2-drop-above .select2-choice,
|
||||
.control-group.info .select2-dropdown-open.select2-drop-above .select2-choices,
|
||||
.control-group.info .select2-container-multi.select2-container-active .select2-choices {
|
||||
border: 1px solid #3A87AD !important;
|
||||
}
|
||||
|
||||
.control-group.info .select2-container .select2-choice div {
|
||||
border-left: 1px solid #3A87AD !important;
|
||||
background: #D9EDF7 !important;
|
||||
}
|
||||
|
||||
.control-group.success .select2-container .select2-choice,
|
||||
.control-group.success .select2-container .select2-choices,
|
||||
.control-group.success .select2-container-active .select2-choice,
|
||||
.control-group.success .select2-container-active .select2-choices,
|
||||
.control-group.success .select2-dropdown-open.select2-drop-above .select2-choice,
|
||||
.control-group.success .select2-dropdown-open.select2-drop-above .select2-choices,
|
||||
.control-group.success .select2-container-multi.select2-container-active .select2-choices {
|
||||
border: 1px solid #468847 !important;
|
||||
}
|
||||
|
||||
.control-group.success .select2-container .select2-choice div {
|
||||
border-left: 1px solid #468847 !important;
|
||||
background: #DFF0D8 !important;
|
||||
}
|
||||
BIN
static/cms/js/select2/select2-spinner.gif
Normal file
|
After Width: | Height: | Size: 1.8 KiB |
704
static/cms/js/select2/select2.css
vendored
Normal file
|
|
@ -0,0 +1,704 @@
|
|||
/*
|
||||
Version: @@ver@@ Timestamp: @@timestamp@@
|
||||
*/
|
||||
.select2-container {
|
||||
margin: 0;
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
/* inline-block for ie7 */
|
||||
zoom: 1;
|
||||
*display: inline;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.select2-container,
|
||||
.select2-drop,
|
||||
.select2-search,
|
||||
.select2-search input {
|
||||
/*
|
||||
Force border-box so that % widths fit the parent
|
||||
container without overlap because of margin/padding.
|
||||
More Info : http://www.quirksmode.org/css/box.html
|
||||
*/
|
||||
-webkit-box-sizing: border-box; /* webkit */
|
||||
-moz-box-sizing: border-box; /* firefox */
|
||||
box-sizing: border-box; /* css3 */
|
||||
}
|
||||
|
||||
.select2-container .select2-choice {
|
||||
display: block;
|
||||
height: 26px;
|
||||
padding: 0 0 0 8px;
|
||||
overflow: hidden;
|
||||
position: relative;
|
||||
|
||||
border: 1px solid #aaa;
|
||||
white-space: nowrap;
|
||||
line-height: 26px;
|
||||
color: #444;
|
||||
text-decoration: none;
|
||||
|
||||
border-radius: 4px;
|
||||
|
||||
background-clip: padding-box;
|
||||
|
||||
-webkit-touch-callout: none;
|
||||
-webkit-user-select: none;
|
||||
-moz-user-select: none;
|
||||
-ms-user-select: none;
|
||||
user-select: none;
|
||||
|
||||
background-color: #fff;
|
||||
background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #eee), color-stop(0.5, #fff));
|
||||
background-image: -webkit-linear-gradient(center bottom, #eee 0%, #fff 50%);
|
||||
background-image: -moz-linear-gradient(center bottom, #eee 0%, #fff 50%);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#ffffff', endColorstr = '#eeeeee', GradientType = 0);
|
||||
background-image: linear-gradient(to top, #eee 0%, #fff 50%);
|
||||
}
|
||||
|
||||
html[dir="rtl"] .select2-container .select2-choice {
|
||||
padding: 0 8px 0 0;
|
||||
}
|
||||
|
||||
.select2-container.select2-drop-above .select2-choice {
|
||||
border-bottom-color: #aaa;
|
||||
|
||||
border-radius: 0 0 4px 4px;
|
||||
|
||||
background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #eee), color-stop(0.9, #fff));
|
||||
background-image: -webkit-linear-gradient(center bottom, #eee 0%, #fff 90%);
|
||||
background-image: -moz-linear-gradient(center bottom, #eee 0%, #fff 90%);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#eeeeee', GradientType=0);
|
||||
background-image: linear-gradient(to bottom, #eee 0%, #fff 90%);
|
||||
}
|
||||
|
||||
.select2-container.select2-allowclear .select2-choice .select2-chosen {
|
||||
margin-right: 42px;
|
||||
}
|
||||
|
||||
.select2-container .select2-choice > .select2-chosen {
|
||||
margin-right: 26px;
|
||||
display: block;
|
||||
overflow: hidden;
|
||||
|
||||
white-space: nowrap;
|
||||
|
||||
text-overflow: ellipsis;
|
||||
float: none;
|
||||
width: auto;
|
||||
}
|
||||
|
||||
html[dir="rtl"] .select2-container .select2-choice > .select2-chosen {
|
||||
margin-left: 26px;
|
||||
margin-right: 0;
|
||||
}
|
||||
|
||||
.select2-container .select2-choice abbr {
|
||||
display: none;
|
||||
width: 12px;
|
||||
height: 12px;
|
||||
position: absolute;
|
||||
right: 24px;
|
||||
top: 8px;
|
||||
|
||||
font-size: 1px;
|
||||
text-decoration: none;
|
||||
|
||||
border: 0;
|
||||
background: url('select2.png') right top no-repeat;
|
||||
cursor: pointer;
|
||||
outline: 0;
|
||||
}
|
||||
|
||||
.select2-container.select2-allowclear .select2-choice abbr {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.select2-container .select2-choice abbr:hover {
|
||||
background-position: right -11px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.select2-drop-mask {
|
||||
border: 0;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
position: fixed;
|
||||
left: 0;
|
||||
top: 0;
|
||||
min-height: 100%;
|
||||
min-width: 100%;
|
||||
height: auto;
|
||||
width: auto;
|
||||
opacity: 0;
|
||||
z-index: 9998;
|
||||
/* styles required for IE to work */
|
||||
background-color: #fff;
|
||||
filter: alpha(opacity=0);
|
||||
}
|
||||
|
||||
.select2-drop {
|
||||
width: 100%;
|
||||
margin-top: -1px;
|
||||
position: absolute;
|
||||
z-index: 9999;
|
||||
top: 100%;
|
||||
|
||||
background: #fff;
|
||||
color: #000;
|
||||
border: 1px solid #aaa;
|
||||
border-top: 0;
|
||||
|
||||
border-radius: 0 0 4px 4px;
|
||||
|
||||
-webkit-box-shadow: 0 4px 5px rgba(0, 0, 0, .15);
|
||||
box-shadow: 0 4px 5px rgba(0, 0, 0, .15);
|
||||
}
|
||||
|
||||
.select2-drop.select2-drop-above {
|
||||
margin-top: 1px;
|
||||
border-top: 1px solid #aaa;
|
||||
border-bottom: 0;
|
||||
|
||||
border-radius: 4px 4px 0 0;
|
||||
|
||||
-webkit-box-shadow: 0 -4px 5px rgba(0, 0, 0, .15);
|
||||
box-shadow: 0 -4px 5px rgba(0, 0, 0, .15);
|
||||
}
|
||||
|
||||
.select2-drop-active {
|
||||
border: 1px solid #5897fb;
|
||||
border-top: none;
|
||||
}
|
||||
|
||||
.select2-drop.select2-drop-above.select2-drop-active {
|
||||
border-top: 1px solid #5897fb;
|
||||
}
|
||||
|
||||
.select2-drop-auto-width {
|
||||
border-top: 1px solid #aaa;
|
||||
width: auto;
|
||||
}
|
||||
|
||||
.select2-drop-auto-width .select2-search {
|
||||
padding-top: 4px;
|
||||
}
|
||||
|
||||
.select2-container .select2-choice .select2-arrow {
|
||||
display: inline-block;
|
||||
width: 18px;
|
||||
height: 100%;
|
||||
position: absolute;
|
||||
right: 0;
|
||||
top: 0;
|
||||
|
||||
border-left: 1px solid #aaa;
|
||||
border-radius: 0 4px 4px 0;
|
||||
|
||||
background-clip: padding-box;
|
||||
|
||||
background: #ccc;
|
||||
background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #ccc), color-stop(0.6, #eee));
|
||||
background-image: -webkit-linear-gradient(center bottom, #ccc 0%, #eee 60%);
|
||||
background-image: -moz-linear-gradient(center bottom, #ccc 0%, #eee 60%);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#eeeeee', endColorstr = '#cccccc', GradientType = 0);
|
||||
background-image: linear-gradient(to top, #ccc 0%, #eee 60%);
|
||||
}
|
||||
|
||||
html[dir="rtl"] .select2-container .select2-choice .select2-arrow {
|
||||
left: 0;
|
||||
right: auto;
|
||||
|
||||
border-left: none;
|
||||
border-right: 1px solid #aaa;
|
||||
border-radius: 4px 0 0 4px;
|
||||
}
|
||||
|
||||
.select2-container .select2-choice .select2-arrow b {
|
||||
display: block;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background: url('select2.png') no-repeat 0 1px;
|
||||
}
|
||||
|
||||
html[dir="rtl"] .select2-container .select2-choice .select2-arrow b {
|
||||
background-position: 2px 1px;
|
||||
}
|
||||
|
||||
.select2-search {
|
||||
display: inline-block;
|
||||
width: 100%;
|
||||
min-height: 26px;
|
||||
margin: 0;
|
||||
padding-left: 4px;
|
||||
padding-right: 4px;
|
||||
|
||||
position: relative;
|
||||
z-index: 10000;
|
||||
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.select2-search input {
|
||||
width: 100%;
|
||||
height: auto !important;
|
||||
min-height: 26px;
|
||||
padding: 4px 20px 4px 5px;
|
||||
margin: 0;
|
||||
|
||||
outline: 0;
|
||||
font-family: sans-serif;
|
||||
font-size: 1em;
|
||||
|
||||
border: 1px solid #aaa;
|
||||
border-radius: 0;
|
||||
|
||||
-webkit-box-shadow: none;
|
||||
box-shadow: none;
|
||||
|
||||
background: #fff url('select2.png') no-repeat 100% -22px;
|
||||
background: url('select2.png') no-repeat 100% -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, #fff), color-stop(0.99, #eee));
|
||||
background: url('select2.png') no-repeat 100% -22px, -webkit-linear-gradient(center bottom, #fff 85%, #eee 99%);
|
||||
background: url('select2.png') no-repeat 100% -22px, -moz-linear-gradient(center bottom, #fff 85%, #eee 99%);
|
||||
background: url('select2.png') no-repeat 100% -22px, linear-gradient(to bottom, #fff 85%, #eee 99%) 0 0;
|
||||
}
|
||||
|
||||
html[dir="rtl"] .select2-search input {
|
||||
padding: 4px 5px 4px 20px;
|
||||
|
||||
background: #fff url('select2.png') no-repeat -37px -22px;
|
||||
background: url('select2.png') no-repeat -37px -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, #fff), color-stop(0.99, #eee));
|
||||
background: url('select2.png') no-repeat -37px -22px, -webkit-linear-gradient(center bottom, #fff 85%, #eee 99%);
|
||||
background: url('select2.png') no-repeat -37px -22px, -moz-linear-gradient(center bottom, #fff 85%, #eee 99%);
|
||||
background: url('select2.png') no-repeat -37px -22px, linear-gradient(to bottom, #fff 85%, #eee 99%) 0 0;
|
||||
}
|
||||
|
||||
.select2-drop.select2-drop-above .select2-search input {
|
||||
margin-top: 4px;
|
||||
}
|
||||
|
||||
.select2-search input.select2-active {
|
||||
background: #fff url('select2-spinner.gif') no-repeat 100%;
|
||||
background: url('select2-spinner.gif') no-repeat 100%, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, #fff), color-stop(0.99, #eee));
|
||||
background: url('select2-spinner.gif') no-repeat 100%, -webkit-linear-gradient(center bottom, #fff 85%, #eee 99%);
|
||||
background: url('select2-spinner.gif') no-repeat 100%, -moz-linear-gradient(center bottom, #fff 85%, #eee 99%);
|
||||
background: url('select2-spinner.gif') no-repeat 100%, linear-gradient(to bottom, #fff 85%, #eee 99%) 0 0;
|
||||
}
|
||||
|
||||
.select2-container-active .select2-choice,
|
||||
.select2-container-active .select2-choices {
|
||||
border: 1px solid #5897fb;
|
||||
outline: none;
|
||||
|
||||
-webkit-box-shadow: 0 0 5px rgba(0, 0, 0, .3);
|
||||
box-shadow: 0 0 5px rgba(0, 0, 0, .3);
|
||||
}
|
||||
|
||||
.select2-dropdown-open .select2-choice {
|
||||
border-bottom-color: transparent;
|
||||
-webkit-box-shadow: 0 1px 0 #fff inset;
|
||||
box-shadow: 0 1px 0 #fff inset;
|
||||
|
||||
border-bottom-left-radius: 0;
|
||||
border-bottom-right-radius: 0;
|
||||
|
||||
background-color: #eee;
|
||||
background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #fff), color-stop(0.5, #eee));
|
||||
background-image: -webkit-linear-gradient(center bottom, #fff 0%, #eee 50%);
|
||||
background-image: -moz-linear-gradient(center bottom, #fff 0%, #eee 50%);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0);
|
||||
background-image: linear-gradient(to top, #fff 0%, #eee 50%);
|
||||
}
|
||||
|
||||
.select2-dropdown-open.select2-drop-above .select2-choice,
|
||||
.select2-dropdown-open.select2-drop-above .select2-choices {
|
||||
border: 1px solid #5897fb;
|
||||
border-top-color: transparent;
|
||||
|
||||
background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #fff), color-stop(0.5, #eee));
|
||||
background-image: -webkit-linear-gradient(center top, #fff 0%, #eee 50%);
|
||||
background-image: -moz-linear-gradient(center top, #fff 0%, #eee 50%);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0);
|
||||
background-image: linear-gradient(to bottom, #fff 0%, #eee 50%);
|
||||
}
|
||||
|
||||
.select2-dropdown-open .select2-choice .select2-arrow {
|
||||
background: transparent;
|
||||
border-left: none;
|
||||
filter: none;
|
||||
}
|
||||
html[dir="rtl"] .select2-dropdown-open .select2-choice .select2-arrow {
|
||||
border-right: none;
|
||||
}
|
||||
|
||||
.select2-dropdown-open .select2-choice .select2-arrow b {
|
||||
background-position: -18px 1px;
|
||||
}
|
||||
|
||||
html[dir="rtl"] .select2-dropdown-open .select2-choice .select2-arrow b {
|
||||
background-position: -16px 1px;
|
||||
}
|
||||
|
||||
.select2-hidden-accessible {
|
||||
border: 0;
|
||||
clip: rect(0 0 0 0);
|
||||
height: 1px;
|
||||
margin: -1px;
|
||||
overflow: hidden;
|
||||
padding: 0;
|
||||
position: absolute;
|
||||
width: 1px;
|
||||
}
|
||||
|
||||
/* results */
|
||||
.select2-results {
|
||||
max-height: 200px;
|
||||
padding: 0 0 0 4px;
|
||||
margin: 4px 4px 4px 0;
|
||||
position: relative;
|
||||
overflow-x: hidden;
|
||||
overflow-y: auto;
|
||||
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
|
||||
}
|
||||
|
||||
html[dir="rtl"] .select2-results {
|
||||
padding: 0 4px 0 0;
|
||||
margin: 4px 0 4px 4px;
|
||||
}
|
||||
|
||||
.select2-results ul.select2-result-sub {
|
||||
margin: 0;
|
||||
padding-left: 0;
|
||||
}
|
||||
|
||||
.select2-results li {
|
||||
list-style: none;
|
||||
display: list-item;
|
||||
background-image: none;
|
||||
}
|
||||
|
||||
.select2-results li.select2-result-with-children > .select2-result-label {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.select2-results .select2-result-label {
|
||||
padding: 3px 7px 4px;
|
||||
margin: 0;
|
||||
cursor: pointer;
|
||||
|
||||
min-height: 1em;
|
||||
|
||||
-webkit-touch-callout: none;
|
||||
-webkit-user-select: none;
|
||||
-moz-user-select: none;
|
||||
-ms-user-select: none;
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
.select2-results-dept-1 .select2-result-label { padding-left: 20px }
|
||||
.select2-results-dept-2 .select2-result-label { padding-left: 40px }
|
||||
.select2-results-dept-3 .select2-result-label { padding-left: 60px }
|
||||
.select2-results-dept-4 .select2-result-label { padding-left: 80px }
|
||||
.select2-results-dept-5 .select2-result-label { padding-left: 100px }
|
||||
.select2-results-dept-6 .select2-result-label { padding-left: 110px }
|
||||
.select2-results-dept-7 .select2-result-label { padding-left: 120px }
|
||||
|
||||
.select2-results .select2-highlighted {
|
||||
background: #3875d7;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.select2-results li em {
|
||||
background: #feffde;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
.select2-results .select2-highlighted em {
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
.select2-results .select2-highlighted ul {
|
||||
background: #fff;
|
||||
color: #000;
|
||||
}
|
||||
|
||||
.select2-results .select2-no-results,
|
||||
.select2-results .select2-searching,
|
||||
.select2-results .select2-ajax-error,
|
||||
.select2-results .select2-selection-limit {
|
||||
background: #f4f4f4;
|
||||
display: list-item;
|
||||
padding-left: 5px;
|
||||
}
|
||||
|
||||
/*
|
||||
disabled look for disabled choices in the results dropdown
|
||||
*/
|
||||
.select2-results .select2-disabled.select2-highlighted {
|
||||
color: #666;
|
||||
background: #f4f4f4;
|
||||
display: list-item;
|
||||
cursor: default;
|
||||
}
|
||||
.select2-results .select2-disabled {
|
||||
background: #f4f4f4;
|
||||
display: list-item;
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
.select2-results .select2-selected {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.select2-more-results.select2-active {
|
||||
background: #f4f4f4 url('select2-spinner.gif') no-repeat 100%;
|
||||
}
|
||||
|
||||
.select2-results .select2-ajax-error {
|
||||
background: rgba(255, 50, 50, .2);
|
||||
}
|
||||
|
||||
.select2-more-results {
|
||||
background: #f4f4f4;
|
||||
display: list-item;
|
||||
}
|
||||
|
||||
/* disabled styles */
|
||||
|
||||
.select2-container.select2-container-disabled .select2-choice {
|
||||
background-color: #f4f4f4;
|
||||
background-image: none;
|
||||
border: 1px solid #ddd;
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
.select2-container.select2-container-disabled .select2-choice .select2-arrow {
|
||||
background-color: #f4f4f4;
|
||||
background-image: none;
|
||||
border-left: 0;
|
||||
}
|
||||
|
||||
.select2-container.select2-container-disabled .select2-choice abbr {
|
||||
display: none;
|
||||
}
|
||||
|
||||
|
||||
/* multiselect */
|
||||
|
||||
.select2-container-multi .select2-choices {
|
||||
height: auto !important;
|
||||
height: 1%;
|
||||
margin: 0;
|
||||
padding: 0 5px 0 0;
|
||||
position: relative;
|
||||
|
||||
border: 1px solid #aaa;
|
||||
cursor: text;
|
||||
overflow: hidden;
|
||||
|
||||
background-color: #fff;
|
||||
background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(1%, #eee), color-stop(15%, #fff));
|
||||
background-image: -webkit-linear-gradient(top, #eee 1%, #fff 15%);
|
||||
background-image: -moz-linear-gradient(top, #eee 1%, #fff 15%);
|
||||
background-image: linear-gradient(to bottom, #eee 1%, #fff 15%);
|
||||
}
|
||||
|
||||
html[dir="rtl"] .select2-container-multi .select2-choices {
|
||||
padding: 0 0 0 5px;
|
||||
}
|
||||
|
||||
.select2-locked {
|
||||
padding: 3px 5px 3px 5px !important;
|
||||
}
|
||||
|
||||
.select2-container-multi .select2-choices {
|
||||
min-height: 26px;
|
||||
}
|
||||
|
||||
.select2-container-multi.select2-container-active .select2-choices {
|
||||
border: 1px solid #5897fb;
|
||||
outline: none;
|
||||
|
||||
-webkit-box-shadow: 0 0 5px rgba(0, 0, 0, .3);
|
||||
box-shadow: 0 0 5px rgba(0, 0, 0, .3);
|
||||
}
|
||||
.select2-container-multi .select2-choices li {
|
||||
float: left;
|
||||
list-style: none;
|
||||
}
|
||||
html[dir="rtl"] .select2-container-multi .select2-choices li
|
||||
{
|
||||
float: right;
|
||||
}
|
||||
.select2-container-multi .select2-choices .select2-search-field {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.select2-container-multi .select2-choices .select2-search-field input {
|
||||
padding: 5px;
|
||||
margin: 1px 0;
|
||||
|
||||
font-family: sans-serif;
|
||||
font-size: 100%;
|
||||
color: #666;
|
||||
outline: 0;
|
||||
border: 0;
|
||||
-webkit-box-shadow: none;
|
||||
box-shadow: none;
|
||||
background: transparent !important;
|
||||
}
|
||||
|
||||
.select2-container-multi .select2-choices .select2-search-field input.select2-active {
|
||||
background: #fff url('select2-spinner.gif') no-repeat 100% !important;
|
||||
}
|
||||
|
||||
.select2-default {
|
||||
color: #999 !important;
|
||||
}
|
||||
|
||||
.select2-container-multi .select2-choices .select2-search-choice {
|
||||
padding: 3px 5px 3px 18px;
|
||||
margin: 3px 0 3px 5px;
|
||||
position: relative;
|
||||
|
||||
line-height: 13px;
|
||||
color: #333;
|
||||
cursor: default;
|
||||
border: 1px solid #aaaaaa;
|
||||
|
||||
border-radius: 3px;
|
||||
|
||||
-webkit-box-shadow: 0 0 2px #fff inset, 0 1px 0 rgba(0, 0, 0, 0.05);
|
||||
box-shadow: 0 0 2px #fff inset, 0 1px 0 rgba(0, 0, 0, 0.05);
|
||||
|
||||
background-clip: padding-box;
|
||||
|
||||
-webkit-touch-callout: none;
|
||||
-webkit-user-select: none;
|
||||
-moz-user-select: none;
|
||||
-ms-user-select: none;
|
||||
user-select: none;
|
||||
|
||||
background-color: #e4e4e4;
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#f4f4f4', GradientType=0);
|
||||
background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eee));
|
||||
background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%);
|
||||
background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%);
|
||||
background-image: linear-gradient(to bottom, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%);
|
||||
}
|
||||
html[dir="rtl"] .select2-container-multi .select2-choices .select2-search-choice
|
||||
{
|
||||
margin: 3px 5px 3px 0;
|
||||
padding: 3px 18px 3px 5px;
|
||||
}
|
||||
.select2-container-multi .select2-choices .select2-search-choice .select2-chosen {
|
||||
cursor: default;
|
||||
}
|
||||
.select2-container-multi .select2-choices .select2-search-choice-focus {
|
||||
background: #d4d4d4;
|
||||
}
|
||||
|
||||
.select2-search-choice-close {
|
||||
display: block;
|
||||
width: 12px;
|
||||
height: 13px;
|
||||
position: absolute;
|
||||
right: 3px;
|
||||
top: 4px;
|
||||
|
||||
font-size: 1px;
|
||||
outline: none;
|
||||
background: url('select2.png') right top no-repeat;
|
||||
}
|
||||
html[dir="rtl"] .select2-search-choice-close {
|
||||
right: auto;
|
||||
left: 3px;
|
||||
}
|
||||
|
||||
.select2-container-multi .select2-search-choice-close {
|
||||
left: 3px;
|
||||
}
|
||||
|
||||
html[dir="rtl"] .select2-container-multi .select2-search-choice-close {
|
||||
left: auto;
|
||||
right: 2px;
|
||||
}
|
||||
|
||||
.select2-container-multi .select2-choices .select2-search-choice .select2-search-choice-close:hover {
|
||||
background-position: right -11px;
|
||||
}
|
||||
.select2-container-multi .select2-choices .select2-search-choice-focus .select2-search-choice-close {
|
||||
background-position: right -11px;
|
||||
}
|
||||
|
||||
/* disabled styles */
|
||||
.select2-container-multi.select2-container-disabled .select2-choices {
|
||||
background-color: #f4f4f4;
|
||||
background-image: none;
|
||||
border: 1px solid #ddd;
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
.select2-container-multi.select2-container-disabled .select2-choices .select2-search-choice {
|
||||
padding: 3px 5px 3px 5px;
|
||||
border: 1px solid #ddd;
|
||||
background-image: none;
|
||||
background-color: #f4f4f4;
|
||||
}
|
||||
|
||||
.select2-container-multi.select2-container-disabled .select2-choices .select2-search-choice .select2-search-choice-close { display: none;
|
||||
background: none;
|
||||
}
|
||||
/* end multiselect */
|
||||
|
||||
|
||||
.select2-result-selectable .select2-match,
|
||||
.select2-result-unselectable .select2-match {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
.select2-offscreen, .select2-offscreen:focus {
|
||||
clip: rect(0 0 0 0) !important;
|
||||
width: 1px !important;
|
||||
height: 1px !important;
|
||||
border: 0 !important;
|
||||
margin: 0 !important;
|
||||
padding: 0 !important;
|
||||
overflow: hidden !important;
|
||||
position: absolute !important;
|
||||
outline: 0 !important;
|
||||
left: 0px !important;
|
||||
top: 0px !important;
|
||||
}
|
||||
|
||||
.select2-display-none {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.select2-measure-scrollbar {
|
||||
position: absolute;
|
||||
top: -10000px;
|
||||
left: -10000px;
|
||||
width: 100px;
|
||||
height: 100px;
|
||||
overflow: scroll;
|
||||
}
|
||||
|
||||
/* Retina-ize icons */
|
||||
|
||||
@media only screen and (-webkit-min-device-pixel-ratio: 1.5), only screen and (min-resolution: 2dppx) {
|
||||
.select2-search input,
|
||||
.select2-search-choice-close,
|
||||
.select2-container .select2-choice abbr,
|
||||
.select2-container .select2-choice .select2-arrow b {
|
||||
background-image: url('select2x2.png') !important;
|
||||
background-repeat: no-repeat !important;
|
||||
background-size: 60px 40px !important;
|
||||
}
|
||||
|
||||
.select2-search input {
|
||||
background-position: 100% -21px !important;
|
||||
}
|
||||
}
|
||||
3508
static/cms/js/select2/select2.js
vendored
Normal file
BIN
static/cms/js/select2/select2.png
Normal file
|
After Width: | Height: | Size: 613 B |
19
static/cms/js/select2/select2_locale_ar.js
vendored
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
/**
|
||||
* Select2 Arabic translation.
|
||||
*
|
||||
* Author: Adel KEDJOUR <adel@kedjour.com>
|
||||
*/
|
||||
(function ($) {
|
||||
"use strict";
|
||||
|
||||
$.fn.select2.locales['ar'] = {
|
||||
formatNoMatches: function () { return "لم يتم العثور على مطابقات"; },
|
||||
formatInputTooShort: function (input, min) { var n = min - input.length; if (n == 1){ return "الرجاء إدخال حرف واحد على الأكثر"; } return n == 2 ? "الرجاء إدخال حرفين على الأكثر" : "الرجاء إدخال " + n + " على الأكثر"; },
|
||||
formatInputTooLong: function (input, max) { var n = input.length - max; if (n == 1){ return "الرجاء إدخال حرف واحد على الأقل"; } return n == 2 ? "الرجاء إدخال حرفين على الأقل" : "الرجاء إدخال " + n + " على الأقل "; },
|
||||
formatSelectionTooBig: function (limit) { if (n == 1){ return "يمكنك أن تختار إختيار واحد فقط"; } return n == 2 ? "يمكنك أن تختار إختيارين فقط" : "يمكنك أن تختار " + n + " إختيارات فقط"; },
|
||||
formatLoadMore: function (pageNumber) { return "تحميل المزيد من النتائج…"; },
|
||||
formatSearching: function () { return "البحث…"; }
|
||||
};
|
||||
|
||||
$.extend($.fn.select2.defaults, $.fn.select2.locales['ar']);
|
||||
})(jQuery);
|
||||
20
static/cms/js/select2/select2_locale_az.js
vendored
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
/**
|
||||
* Select2 Azerbaijani translation.
|
||||
*
|
||||
* Author: Farhad Safarov <farhad.safarov@gmail.com>
|
||||
*/
|
||||
(function ($) {
|
||||
"use strict";
|
||||
|
||||
$.fn.select2.locales['az'] = {
|
||||
formatMatches: function (matches) { return matches + " nəticə mövcuddur, hərəkət etdirmək üçün yuxarı və aşağı düymələrindən istifadə edin."; },
|
||||
formatNoMatches: function () { return "Nəticə tapılmadı"; },
|
||||
formatInputTooShort: function (input, min) { var n = min - input.length; return n + " simvol daxil edin"; },
|
||||
formatInputTooLong: function (input, max) { var n = input.length - max; return n + " simvol silin"; },
|
||||
formatSelectionTooBig: function (limit) { return "Sadəcə " + limit + " element seçə bilərsiniz"; },
|
||||
formatLoadMore: function (pageNumber) { return "Daha çox nəticə yüklənir…"; },
|
||||
formatSearching: function () { return "Axtarılır…"; }
|
||||
};
|
||||
|
||||
$.extend($.fn.select2.defaults, $.fn.select2.locales['az']);
|
||||
})(jQuery);
|
||||
20
static/cms/js/select2/select2_locale_bg.js
vendored
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
/**
|
||||
* Select2 Bulgarian translation.
|
||||
*
|
||||
* @author Lubomir Vikev <lubomirvikev@gmail.com>
|
||||
* @author Uriy Efremochkin <efremochkin@uriy.me>
|
||||
*/
|
||||
(function ($) {
|
||||
"use strict";
|
||||
|
||||
$.fn.select2.locales['bg'] = {
|
||||
formatNoMatches: function () { return "Няма намерени съвпадения"; },
|
||||
formatInputTooShort: function (input, min) { var n = min - input.length; return "Моля въведете още " + n + " символ" + (n > 1 ? "а" : ""); },
|
||||
formatInputTooLong: function (input, max) { var n = input.length - max; return "Моля въведете с " + n + " по-малко символ" + (n > 1 ? "а" : ""); },
|
||||
formatSelectionTooBig: function (limit) { return "Можете да направите до " + limit + (limit > 1 ? " избора" : " избор"); },
|
||||
formatLoadMore: function (pageNumber) { return "Зареждат се още…"; },
|
||||
formatSearching: function () { return "Търсене…"; }
|
||||
};
|
||||
|
||||
$.extend($.fn.select2.defaults, $.fn.select2.locales['bg']);
|
||||
})(jQuery);
|
||||
19
static/cms/js/select2/select2_locale_ca.js
vendored
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
/**
|
||||
* Select2 Catalan translation.
|
||||
*
|
||||
* Author: David Planella <david.planella@gmail.com>
|
||||
*/
|
||||
(function ($) {
|
||||
"use strict";
|
||||
|
||||
$.fn.select2.locales['ca'] = {
|
||||
formatNoMatches: function () { return "No s'ha trobat cap coincidència"; },
|
||||
formatInputTooShort: function (input, min) { var n = min - input.length; return "Introduïu " + n + " caràcter" + (n == 1 ? "" : "s") + " més"; },
|
||||
formatInputTooLong: function (input, max) { var n = input.length - max; return "Introduïu " + n + " caràcter" + (n == 1? "" : "s") + "menys"; },
|
||||
formatSelectionTooBig: function (limit) { return "Només podeu seleccionar " + limit + " element" + (limit == 1 ? "" : "s"); },
|
||||
formatLoadMore: function (pageNumber) { return "S'estan carregant més resultats…"; },
|
||||
formatSearching: function () { return "S'està cercant…"; }
|
||||
};
|
||||
|
||||
$.extend($.fn.select2.defaults, $.fn.select2.locales['ca']);
|
||||
})(jQuery);
|
||||
51
static/cms/js/select2/select2_locale_cs.js
vendored
Normal file
|
|
@ -0,0 +1,51 @@
|
|||
/**
|
||||
* Select2 Czech translation.
|
||||
*
|
||||
* Author: Michal Marek <ahoj@michal-marek.cz>
|
||||
* Author - sklonovani: David Vallner <david@vallner.net>
|
||||
*/
|
||||
(function ($) {
|
||||
"use strict";
|
||||
// use text for the numbers 2 through 4
|
||||
var smallNumbers = {
|
||||
2: function(masc) { return (masc ? "dva" : "dvě"); },
|
||||
3: function() { return "tři"; },
|
||||
4: function() { return "čtyři"; }
|
||||
}
|
||||
$.fn.select2.locales['cs'] = {
|
||||
formatNoMatches: function () { return "Nenalezeny žádné položky"; },
|
||||
formatInputTooShort: function (input, min) {
|
||||
var n = min - input.length;
|
||||
if (n == 1) {
|
||||
return "Prosím zadejte ještě jeden znak";
|
||||
} else if (n <= 4) {
|
||||
return "Prosím zadejte ještě další "+smallNumbers[n](true)+" znaky";
|
||||
} else {
|
||||
return "Prosím zadejte ještě dalších "+n+" znaků";
|
||||
}
|
||||
},
|
||||
formatInputTooLong: function (input, max) {
|
||||
var n = input.length - max;
|
||||
if (n == 1) {
|
||||
return "Prosím zadejte o jeden znak méně";
|
||||
} else if (n <= 4) {
|
||||
return "Prosím zadejte o "+smallNumbers[n](true)+" znaky méně";
|
||||
} else {
|
||||
return "Prosím zadejte o "+n+" znaků méně";
|
||||
}
|
||||
},
|
||||
formatSelectionTooBig: function (limit) {
|
||||
if (limit == 1) {
|
||||
return "Můžete zvolit jen jednu položku";
|
||||
} else if (limit <= 4) {
|
||||
return "Můžete zvolit maximálně "+smallNumbers[limit](false)+" položky";
|
||||
} else {
|
||||
return "Můžete zvolit maximálně "+limit+" položek";
|
||||
}
|
||||
},
|
||||
formatLoadMore: function (pageNumber) { return "Načítají se další výsledky…"; },
|
||||
formatSearching: function () { return "Vyhledávání…"; }
|
||||
};
|
||||
|
||||
$.extend($.fn.select2.defaults, $.fn.select2.locales['cs']);
|
||||
})(jQuery);
|
||||
19
static/cms/js/select2/select2_locale_da.js
vendored
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
/**
|
||||
* Select2 Danish translation.
|
||||
*
|
||||
* Author: Anders Jenbo <anders@jenbo.dk>
|
||||
*/
|
||||
(function ($) {
|
||||
"use strict";
|
||||
|
||||
$.fn.select2.locales['da'] = {
|
||||
formatNoMatches: function () { return "Ingen resultater fundet"; },
|
||||
formatInputTooShort: function (input, min) { var n = min - input.length; return "Angiv venligst " + n + " tegn mere"; },
|
||||
formatInputTooLong: function (input, max) { var n = input.length - max; return "Angiv venligst " + n + " tegn mindre"; },
|
||||
formatSelectionTooBig: function (limit) { return "Du kan kun vælge " + limit + " emne" + (limit === 1 ? "" : "r"); },
|
||||
formatLoadMore: function (pageNumber) { return "Indlæser flere resultater…"; },
|
||||
formatSearching: function () { return "Søger…"; }
|
||||
};
|
||||
|
||||
$.extend($.fn.select2.defaults, $.fn.select2.locales['da']);
|
||||
})(jQuery);
|
||||
18
static/cms/js/select2/select2_locale_de.js
vendored
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
/**
|
||||
* Select2 German translation
|
||||
*/
|
||||
(function ($) {
|
||||
"use strict";
|
||||
|
||||
$.fn.select2.locales['de'] = {
|
||||
formatNoMatches: function () { return "Keine Übereinstimmungen gefunden"; },
|
||||
formatInputTooShort: function (input, min) { var n = min - input.length; return "Bitte " + n + " Zeichen mehr eingeben"; },
|
||||
formatInputTooLong: function (input, max) { var n = input.length - max; return "Bitte " + n + " Zeichen weniger eingeben"; },
|
||||
formatSelectionTooBig: function (limit) { return "Sie können nur " + limit + " Eintr" + (limit === 1 ? "ag" : "äge") + " auswählen"; },
|
||||
formatLoadMore: function (pageNumber) { return "Lade mehr Ergebnisse…"; },
|
||||
formatSearching: function () { return "Suche…"; },
|
||||
formatMatches: function (matches) { return matches + " Ergebnis " + (matches > 1 ? "se" : "") + " verfügbar, zum Navigieren die Hoch-/Runter-Pfeiltasten verwenden."; }
|
||||
};
|
||||
|
||||
$.extend($.fn.select2.defaults, $.fn.select2.locales['de']);
|
||||
})(jQuery);
|
||||
19
static/cms/js/select2/select2_locale_el.js
vendored
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
/**
|
||||
* Select2 Greek translation.
|
||||
*
|
||||
* @author Uriy Efremochkin <efremochkin@uriy.me>
|
||||
*/
|
||||
(function ($) {
|
||||
"use strict";
|
||||
|
||||
$.fn.select2.locales['el'] = {
|
||||
formatNoMatches: function () { return "Δεν βρέθηκαν αποτελέσματα"; },
|
||||
formatInputTooShort: function (input, min) { var n = min - input.length; return "Παρακαλούμε εισάγετε " + n + " περισσότερο" + (n > 1 ? "υς" : "") + " χαρακτήρ" + (n > 1 ? "ες" : "α"); },
|
||||
formatInputTooLong: function (input, max) { var n = input.length - max; return "Παρακαλούμε διαγράψτε " + n + " χαρακτήρ" + (n > 1 ? "ες" : "α"); },
|
||||
formatSelectionTooBig: function (limit) { return "Μπορείτε να επιλέξετε μόνο " + limit + " αντικείμεν" + (limit > 1 ? "α" : "ο"); },
|
||||
formatLoadMore: function (pageNumber) { return "Φόρτωση περισσότερων…"; },
|
||||
formatSearching: function () { return "Αναζήτηση…"; }
|
||||
};
|
||||
|
||||
$.extend($.fn.select2.defaults, $.fn.select2.locales['el']);
|
||||
})(jQuery);
|
||||
20
static/cms/js/select2/select2_locale_en.js.template
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
/**
|
||||
* Select2 <Language> translation.
|
||||
*
|
||||
* Author: Your Name <your@email>
|
||||
*/
|
||||
(function ($) {
|
||||
"use strict";
|
||||
|
||||
$.fn.select2.locales['en'] = {
|
||||
formatMatches: function (matches) { if (matches === 1) { return "One result is available, press enter to select it."; } return matches + " results are available, use up and down arrow keys to navigate."; },
|
||||
formatNoMatches: function () { return "No matches found"; },
|
||||
formatInputTooShort: function (input, min) { var n = min - input.length; return "Please enter " + n + " or more character" + (n == 1 ? "" : "s"); },
|
||||
formatInputTooLong: function (input, max) { var n = input.length - max; return "Please delete " + n + " character" + (n == 1 ? "" : "s"); },
|
||||
formatSelectionTooBig: function (limit) { return "You can only select " + limit + " item" + (limit == 1 ? "" : "s"); },
|
||||
formatLoadMore: function (pageNumber) { return "Loading more results…"; },
|
||||
formatSearching: function () { return "Searching…"; }
|
||||
};
|
||||
|
||||
$.extend($.fn.select2.defaults, $.fn.select2.locales['en']);
|
||||
})(jQuery);
|
||||
17
static/cms/js/select2/select2_locale_es.js
vendored
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
/**
|
||||
* Select2 Spanish translation
|
||||
*/
|
||||
(function ($) {
|
||||
"use strict";
|
||||
|
||||
$.fn.select2.locales['es'] = {
|
||||
formatNoMatches: function () { return "No se encontraron resultados"; },
|
||||
formatInputTooShort: function (input, min) { var n = min - input.length; return "Por favor, introduzca " + n + " car" + (n == 1? "ácter" : "acteres"); },
|
||||
formatInputTooLong: function (input, max) { var n = input.length - max; return "Por favor, elimine " + n + " car" + (n == 1? "ácter" : "acteres"); },
|
||||
formatSelectionTooBig: function (limit) { return "Sólo puede seleccionar " + limit + " elemento" + (limit == 1 ? "" : "s"); },
|
||||
formatLoadMore: function (pageNumber) { return "Cargando más resultados…"; },
|
||||
formatSearching: function () { return "Buscando…"; }
|
||||
};
|
||||
|
||||
$.extend($.fn.select2.defaults, $.fn.select2.locales['es']);
|
||||
})(jQuery);
|
||||
19
static/cms/js/select2/select2_locale_et.js
vendored
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
/**
|
||||
* Select2 Estonian translation.
|
||||
*
|
||||
* Author: Kuldar Kalvik <kuldar@kalvik.ee>
|
||||
*/
|
||||
(function ($) {
|
||||
"use strict";
|
||||
|
||||
$.fn.select2.locales['et'] = {
|
||||
formatNoMatches: function () { return "Tulemused puuduvad"; },
|
||||
formatInputTooShort: function (input, min) { var n = min - input.length; return "Sisesta " + n + " täht" + (n == 1 ? "" : "e") + " rohkem"; },
|
||||
formatInputTooLong: function (input, max) { var n = input.length - max; return "Sisesta " + n + " täht" + (n == 1? "" : "e") + " vähem"; },
|
||||
formatSelectionTooBig: function (limit) { return "Saad vaid " + limit + " tulemus" + (limit == 1 ? "e" : "t") + " valida"; },
|
||||
formatLoadMore: function (pageNumber) { return "Laen tulemusi.."; },
|
||||
formatSearching: function () { return "Otsin.."; }
|
||||
};
|
||||
|
||||
$.extend($.fn.select2.defaults, $.fn.select2.locales['et']);
|
||||
})(jQuery);
|
||||
45
static/cms/js/select2/select2_locale_eu.js
vendored
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
/**
|
||||
* Select2 Basque translation.
|
||||
*
|
||||
* Author: Julen Ruiz Aizpuru <julenx at gmail dot com>
|
||||
*/
|
||||
(function ($) {
|
||||
"use strict";
|
||||
|
||||
$.fn.select2.locales['eu'] = {
|
||||
formatNoMatches: function () {
|
||||
return "Ez da bat datorrenik aurkitu";
|
||||
},
|
||||
formatInputTooShort: function (input, min) {
|
||||
var n = min - input.length;
|
||||
if (n === 1) {
|
||||
return "Idatzi karaktere bat gehiago";
|
||||
} else {
|
||||
return "Idatzi " + n + " karaktere gehiago";
|
||||
}
|
||||
},
|
||||
formatInputTooLong: function (input, max) {
|
||||
var n = input.length - max;
|
||||
if (n === 1) {
|
||||
return "Idatzi karaktere bat gutxiago";
|
||||
} else {
|
||||
return "Idatzi " + n + " karaktere gutxiago";
|
||||
}
|
||||
},
|
||||
formatSelectionTooBig: function (limit) {
|
||||
if (limit === 1 ) {
|
||||
return "Elementu bakarra hauta dezakezu";
|
||||
} else {
|
||||
return limit + " elementu hauta ditzakezu soilik";
|
||||
}
|
||||
},
|
||||
formatLoadMore: function (pageNumber) {
|
||||
return "Emaitza gehiago kargatzen…";
|
||||
},
|
||||
formatSearching: function () {
|
||||
return "Bilatzen…";
|
||||
}
|
||||
};
|
||||
|
||||
$.extend($.fn.select2.defaults, $.fn.select2.locales['eu']);
|
||||
})(jQuery);
|
||||
21
static/cms/js/select2/select2_locale_fa.js
vendored
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
/**
|
||||
* Select2 Persian translation.
|
||||
*
|
||||
* Author: Ali Choopan <choopan@arsh.co>
|
||||
* Author: Ebrahim Byagowi <ebrahim@gnu.org>
|
||||
*/
|
||||
(function ($) {
|
||||
"use strict";
|
||||
|
||||
$.fn.select2.locales['fa'] = {
|
||||
formatMatches: function (matches) { return matches + " نتیجه موجود است، کلیدهای جهت بالا و پایین را برای گشتن استفاده کنید."; },
|
||||
formatNoMatches: function () { return "نتیجهای یافت نشد."; },
|
||||
formatInputTooShort: function (input, min) { var n = min - input.length; return "لطفاً " + n + " نویسه بیشتر وارد نمایید"; },
|
||||
formatInputTooLong: function (input, max) { var n = input.length - max; return "لطفاً " + n + " نویسه را حذف کنید."; },
|
||||
formatSelectionTooBig: function (limit) { return "شما فقط میتوانید " + limit + " مورد را انتخاب کنید"; },
|
||||
formatLoadMore: function (pageNumber) { return "در حال بارگیری موارد بیشتر…"; },
|
||||
formatSearching: function () { return "در حال جستجو…"; }
|
||||
};
|
||||
|
||||
$.extend($.fn.select2.defaults, $.fn.select2.locales['fa']);
|
||||
})(jQuery);
|
||||
30
static/cms/js/select2/select2_locale_fi.js
vendored
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
/**
|
||||
* Select2 Finnish translation
|
||||
*/
|
||||
(function ($) {
|
||||
"use strict";
|
||||
$.fn.select2.locales['fi'] = {
|
||||
formatNoMatches: function () {
|
||||
return "Ei tuloksia";
|
||||
},
|
||||
formatInputTooShort: function (input, min) {
|
||||
var n = min - input.length;
|
||||
return "Ole hyvä ja anna " + n + " merkkiä lisää";
|
||||
},
|
||||
formatInputTooLong: function (input, max) {
|
||||
var n = input.length - max;
|
||||
return "Ole hyvä ja anna " + n + " merkkiä vähemmän";
|
||||
},
|
||||
formatSelectionTooBig: function (limit) {
|
||||
return "Voit valita ainoastaan " + limit + " kpl";
|
||||
},
|
||||
formatLoadMore: function (pageNumber) {
|
||||
return "Ladataan lisää tuloksia…";
|
||||
},
|
||||
formatSearching: function () {
|
||||
return "Etsitään…";
|
||||
}
|
||||
};
|
||||
|
||||
$.extend($.fn.select2.defaults, $.fn.select2.locales['fi']);
|
||||
})(jQuery);
|
||||
18
static/cms/js/select2/select2_locale_fr.js
vendored
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
/**
|
||||
* Select2 French translation
|
||||
*/
|
||||
(function ($) {
|
||||
"use strict";
|
||||
|
||||
$.fn.select2.locales['fr'] = {
|
||||
formatMatches: function (matches) { return matches + " résultats sont disponibles, utilisez les flèches haut et bas pour naviguer."; },
|
||||
formatNoMatches: function () { return "Aucun résultat trouvé"; },
|
||||
formatInputTooShort: function (input, min) { var n = min - input.length; return "Saisissez " + n + " caractère" + (n == 1? "" : "s") + " supplémentaire" + (n == 1? "" : "s") ; },
|
||||
formatInputTooLong: function (input, max) { var n = input.length - max; return "Supprimez " + n + " caractère" + (n == 1? "" : "s"); },
|
||||
formatSelectionTooBig: function (limit) { return "Vous pouvez seulement sélectionner " + limit + " élément" + (limit == 1 ? "" : "s"); },
|
||||
formatLoadMore: function (pageNumber) { return "Chargement de résultats supplémentaires…"; },
|
||||
formatSearching: function () { return "Recherche en cours…"; }
|
||||
};
|
||||
|
||||
$.extend($.fn.select2.defaults, $.fn.select2.locales['fr']);
|
||||
})(jQuery);
|
||||
45
static/cms/js/select2/select2_locale_gl.js
vendored
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
/**
|
||||
* Select2 Galician translation
|
||||
*
|
||||
* Author: Leandro Regueiro <leandro.regueiro@gmail.com>
|
||||
*/
|
||||
(function ($) {
|
||||
"use strict";
|
||||
|
||||
$.fn.select2.locales['gl'] = {
|
||||
formatNoMatches: function () {
|
||||
return "Non se atoparon resultados";
|
||||
},
|
||||
formatInputTooShort: function (input, min) {
|
||||
var n = min - input.length;
|
||||
if (n === 1) {
|
||||
return "Engada un carácter";
|
||||
} else {
|
||||
return "Engada " + n + " caracteres";
|
||||
}
|
||||
},
|
||||
formatInputTooLong: function (input, max) {
|
||||
var n = input.length - max;
|
||||
if (n === 1) {
|
||||
return "Elimine un carácter";
|
||||
} else {
|
||||
return "Elimine " + n + " caracteres";
|
||||
}
|
||||
},
|
||||
formatSelectionTooBig: function (limit) {
|
||||
if (limit === 1 ) {
|
||||
return "Só pode seleccionar un elemento";
|
||||
} else {
|
||||
return "Só pode seleccionar " + limit + " elementos";
|
||||
}
|
||||
},
|
||||
formatLoadMore: function (pageNumber) {
|
||||
return "Cargando máis resultados…";
|
||||
},
|
||||
formatSearching: function () {
|
||||
return "Buscando…";
|
||||
}
|
||||
};
|
||||
|
||||
$.extend($.fn.select2.defaults, $.fn.select2.locales['gl']);
|
||||
})(jQuery);
|
||||
19
static/cms/js/select2/select2_locale_he.js
vendored
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
/**
|
||||
* Select2 Hebrew translation.
|
||||
*
|
||||
* Author: Yakir Sitbon <http://www.yakirs.net/>
|
||||
*/
|
||||
(function ($) {
|
||||
"use strict";
|
||||
|
||||
$.fn.select2.locales['he'] = {
|
||||
formatNoMatches: function () { return "לא נמצאו התאמות"; },
|
||||
formatInputTooShort: function (input, min) { var n = min - input.length; return "נא להזין עוד " + n + " תווים נוספים"; },
|
||||
formatInputTooLong: function (input, max) { var n = input.length - max; return "נא להזין פחות " + n + " תווים"; },
|
||||
formatSelectionTooBig: function (limit) { return "ניתן לבחור " + limit + " פריטים"; },
|
||||
formatLoadMore: function (pageNumber) { return "טוען תוצאות נוספות…"; },
|
||||
formatSearching: function () { return "מחפש…"; }
|
||||
};
|
||||
|
||||
$.extend($.fn.select2.defaults, $.fn.select2.locales['he']);
|
||||
})(jQuery);
|
||||
24
static/cms/js/select2/select2_locale_hr.js
vendored
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
/**
|
||||
* Select2 Croatian translation.
|
||||
*
|
||||
* @author Edi Modrić <edi.modric@gmail.com>
|
||||
* @author Uriy Efremochkin <efremochkin@uriy.me>
|
||||
*/
|
||||
(function ($) {
|
||||
"use strict";
|
||||
|
||||
$.fn.select2.locales['hr'] = {
|
||||
formatNoMatches: function () { return "Nema rezultata"; },
|
||||
formatInputTooShort: function (input, min) { return "Unesite još" + character(min - input.length); },
|
||||
formatInputTooLong: function (input, max) { return "Unesite" + character(input.length - max) + " manje"; },
|
||||
formatSelectionTooBig: function (limit) { return "Maksimalan broj odabranih stavki je " + limit; },
|
||||
formatLoadMore: function (pageNumber) { return "Učitavanje rezultata…"; },
|
||||
formatSearching: function () { return "Pretraga…"; }
|
||||
};
|
||||
|
||||
$.extend($.fn.select2.defaults, $.fn.select2.locales['hr']);
|
||||
|
||||
function character (n) {
|
||||
return " " + n + " znak" + (n%10 < 5 && n%10 > 0 && (n%100 < 5 || n%100 > 19) ? n%10 > 1 ? "a" : "" : "ova");
|
||||
}
|
||||
})(jQuery);
|
||||
17
static/cms/js/select2/select2_locale_hu.js
vendored
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
/**
|
||||
* Select2 Hungarian translation
|
||||
*/
|
||||
(function ($) {
|
||||
"use strict";
|
||||
|
||||
$.fn.select2.locales['hu'] = {
|
||||
formatNoMatches: function () { return "Nincs találat."; },
|
||||
formatInputTooShort: function (input, min) { var n = min - input.length; return "Túl rövid. Még " + n + " karakter hiányzik."; },
|
||||
formatInputTooLong: function (input, max) { var n = input.length - max; return "Túl hosszú. " + n + " karakterrel több, mint kellene."; },
|
||||
formatSelectionTooBig: function (limit) { return "Csak " + limit + " elemet lehet kiválasztani."; },
|
||||
formatLoadMore: function (pageNumber) { return "Töltés…"; },
|
||||
formatSearching: function () { return "Keresés…"; }
|
||||
};
|
||||
|
||||
$.extend($.fn.select2.defaults, $.fn.select2.locales['hu']);
|
||||
})(jQuery);
|
||||
19
static/cms/js/select2/select2_locale_id.js
vendored
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
/**
|
||||
* Select2 Indonesian translation.
|
||||
*
|
||||
* Author: Ibrahim Yusuf <ibrahim7usuf@gmail.com>
|
||||
*/
|
||||
(function ($) {
|
||||
"use strict";
|
||||
|
||||
$.fn.select2.locales['id'] = {
|
||||
formatNoMatches: function () { return "Tidak ada data yang sesuai"; },
|
||||
formatInputTooShort: function (input, min) { var n = min - input.length; return "Masukkan " + n + " huruf lagi" + (n == 1 ? "" : "s"); },
|
||||
formatInputTooLong: function (input, max) { var n = input.length - max; return "Hapus " + n + " huruf" + (n == 1 ? "" : "s"); },
|
||||
formatSelectionTooBig: function (limit) { return "Anda hanya dapat memilih " + limit + " pilihan" + (limit == 1 ? "" : "s"); },
|
||||
formatLoadMore: function (pageNumber) { return "Mengambil data…"; },
|
||||
formatSearching: function () { return "Mencari…"; }
|
||||
};
|
||||
|
||||
$.extend($.fn.select2.defaults, $.fn.select2.locales['id']);
|
||||
})(jQuery);
|
||||
17
static/cms/js/select2/select2_locale_is.js
vendored
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
/**
|
||||
* Select2 Icelandic translation.
|
||||
*/
|
||||
(function ($) {
|
||||
"use strict";
|
||||
|
||||
$.fn.select2.locales['is'] = {
|
||||
formatNoMatches: function () { return "Ekkert fannst"; },
|
||||
formatInputTooShort: function (input, min) { var n = min - input.length; return "Vinsamlegast skrifið " + n + " staf" + (n > 1 ? "i" : "") + " í viðbót"; },
|
||||
formatInputTooLong: function (input, max) { var n = input.length - max; return "Vinsamlegast styttið texta um " + n + " staf" + (n > 1 ? "i" : ""); },
|
||||
formatSelectionTooBig: function (limit) { return "Þú getur aðeins valið " + limit + " atriði"; },
|
||||
formatLoadMore: function (pageNumber) { return "Sæki fleiri niðurstöður…"; },
|
||||
formatSearching: function () { return "Leita…"; }
|
||||
};
|
||||
|
||||
$.extend($.fn.select2.defaults, $.fn.select2.locales['is']);
|
||||
})(jQuery);
|
||||
17
static/cms/js/select2/select2_locale_it.js
vendored
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
/**
|
||||
* Select2 Italian translation
|
||||
*/
|
||||
(function ($) {
|
||||
"use strict";
|
||||
|
||||
$.fn.select2.locales['it'] = {
|
||||
formatNoMatches: function () { return "Nessuna corrispondenza trovata"; },
|
||||
formatInputTooShort: function (input, min) { var n = min - input.length; return "Inserisci ancora " + n + " caratter" + (n == 1? "e" : "i"); },
|
||||
formatInputTooLong: function (input, max) { var n = input.length - max; return "Inserisci " + n + " caratter" + (n == 1? "e" : "i") + " in meno"; },
|
||||
formatSelectionTooBig: function (limit) { return "Puoi selezionare solo " + limit + " element" + (limit == 1 ? "o" : "i"); },
|
||||
formatLoadMore: function (pageNumber) { return "Caricamento in corso…"; },
|
||||
formatSearching: function () { return "Ricerca…"; }
|
||||
};
|
||||
|
||||
$.extend($.fn.select2.defaults, $.fn.select2.locales['it']);
|
||||
})(jQuery);
|
||||
17
static/cms/js/select2/select2_locale_ja.js
vendored
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
/**
|
||||
* Select2 Japanese translation.
|
||||
*/
|
||||
(function ($) {
|
||||
"use strict";
|
||||
|
||||
$.fn.select2.locales['ja'] = {
|
||||
formatNoMatches: function () { return "該当なし"; },
|
||||
formatInputTooShort: function (input, min) { var n = min - input.length; return "後" + n + "文字入れてください"; },
|
||||
formatInputTooLong: function (input, max) { var n = input.length - max; return "検索文字列が" + n + "文字長すぎます"; },
|
||||
formatSelectionTooBig: function (limit) { return "最多で" + limit + "項目までしか選択できません"; },
|
||||
formatLoadMore: function (pageNumber) { return "読込中・・・"; },
|
||||
formatSearching: function () { return "検索中・・・"; }
|
||||
};
|
||||
|
||||
$.extend($.fn.select2.defaults, $.fn.select2.locales['ja']);
|
||||
})(jQuery);
|
||||
19
static/cms/js/select2/select2_locale_ka.js
vendored
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
/**
|
||||
* Select2 Georgian (Kartuli) translation.
|
||||
*
|
||||
* Author: Dimitri Kurashvili dimakura@gmail.com
|
||||
*/
|
||||
(function ($) {
|
||||
"use strict";
|
||||
|
||||
$.fn.select2.locales['ka'] = {
|
||||
formatNoMatches: function () { return "ვერ მოიძებნა"; },
|
||||
formatInputTooShort: function (input, min) { var n = min - input.length; return "გთხოვთ შეიყვანოთ კიდევ " + n + " სიმბოლო"; },
|
||||
formatInputTooLong: function (input, max) { var n = input.length - max; return "გთხოვთ წაშალოთ " + n + " სიმბოლო"; },
|
||||
formatSelectionTooBig: function (limit) { return "თქვენ შეგიძლიათ მხოლოდ " + limit + " ჩანაწერის მონიშვნა"; },
|
||||
formatLoadMore: function (pageNumber) { return "შედეგის ჩატვირთვა…"; },
|
||||
formatSearching: function () { return "ძებნა…"; }
|
||||
};
|
||||
|
||||
$.extend($.fn.select2.defaults, $.fn.select2.locales['ka']);
|
||||
})(jQuery);
|
||||
19
static/cms/js/select2/select2_locale_ko.js
vendored
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
/**
|
||||
* Select2 Korean translation.
|
||||
*
|
||||
* @author Swen Mun <longfinfunnel@gmail.com>
|
||||
*/
|
||||
(function ($) {
|
||||
"use strict";
|
||||
|
||||
$.fn.select2.locales['ko'] = {
|
||||
formatNoMatches: function () { return "결과 없음"; },
|
||||
formatInputTooShort: function (input, min) { var n = min - input.length; return "너무 짧습니다. "+n+"글자 더 입력해주세요."; },
|
||||
formatInputTooLong: function (input, max) { var n = input.length - max; return "너무 깁니다. "+n+"글자 지워주세요."; },
|
||||
formatSelectionTooBig: function (limit) { return "최대 "+limit+"개까지만 선택하실 수 있습니다."; },
|
||||
formatLoadMore: function (pageNumber) { return "불러오는 중…"; },
|
||||
formatSearching: function () { return "검색 중…"; }
|
||||
};
|
||||
|
||||
$.extend($.fn.select2.defaults, $.fn.select2.locales['ko']);
|
||||
})(jQuery);
|
||||
26
static/cms/js/select2/select2_locale_lt.js
vendored
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
/**
|
||||
* Select2 Lithuanian translation.
|
||||
*
|
||||
* @author CRONUS Karmalakas <cronus dot karmalakas at gmail dot com>
|
||||
* @author Uriy Efremochkin <efremochkin@uriy.me>
|
||||
*/
|
||||
(function ($) {
|
||||
"use strict";
|
||||
|
||||
$.fn.select2.locales['lt'] = {
|
||||
formatNoMatches: function () { return "Atitikmenų nerasta"; },
|
||||
formatInputTooShort: function (input, min) { return "Įrašykite dar" + character(min - input.length); },
|
||||
formatInputTooLong: function (input, max) { return "Pašalinkite" + character(input.length - max); },
|
||||
formatSelectionTooBig: function (limit) {
|
||||
return "Jūs galite pasirinkti tik " + limit + " element" + ((limit%100 > 9 && limit%100 < 21) || limit%10 == 0 ? "ų" : limit%10 > 1 ? "us" : "ą");
|
||||
},
|
||||
formatLoadMore: function (pageNumber) { return "Kraunama daugiau rezultatų…"; },
|
||||
formatSearching: function () { return "Ieškoma…"; }
|
||||
};
|
||||
|
||||
$.extend($.fn.select2.defaults, $.fn.select2.locales['lt']);
|
||||
|
||||
function character (n) {
|
||||
return " " + n + " simbol" + ((n%100 > 9 && n%100 < 21) || n%10 == 0 ? "ių" : n%10 > 1 ? "ius" : "į");
|
||||
}
|
||||
})(jQuery);
|
||||
19
static/cms/js/select2/select2_locale_lv.js
vendored
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
/**
|
||||
* Select2 Latvian translation.
|
||||
*
|
||||
* @author Uriy Efremochkin <efremochkin@uriy.me>
|
||||
*/
|
||||
(function ($) {
|
||||
"use strict";
|
||||
|
||||
$.fn.select2.locales['lv'] = {
|
||||
formatNoMatches: function () { return "Sakritību nav"; },
|
||||
formatInputTooShort: function (input, min) { var n = min - input.length; return "Lūdzu ievadiet vēl " + n + " simbol" + (n == 11 ? "us" : n%10 == 1 ? "u" : "us"); },
|
||||
formatInputTooLong: function (input, max) { var n = input.length - max; return "Lūdzu ievadiet par " + n + " simbol" + (n == 11 ? "iem" : n%10 == 1 ? "u" : "iem") + " mazāk"; },
|
||||
formatSelectionTooBig: function (limit) { return "Jūs varat izvēlēties ne vairāk kā " + limit + " element" + (limit == 11 ? "us" : limit%10 == 1 ? "u" : "us"); },
|
||||
formatLoadMore: function (pageNumber) { return "Datu ielāde…"; },
|
||||
formatSearching: function () { return "Meklēšana…"; }
|
||||
};
|
||||
|
||||
$.extend($.fn.select2.defaults, $.fn.select2.locales['lv']);
|
||||
})(jQuery);
|
||||
19
static/cms/js/select2/select2_locale_mk.js
vendored
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
/**
|
||||
* Select2 Macedonian translation.
|
||||
*
|
||||
* Author: Marko Aleksic <psybaron@gmail.com>
|
||||
*/
|
||||
(function ($) {
|
||||
"use strict";
|
||||
|
||||
$.fn.select2.locales['mk'] = {
|
||||
formatNoMatches: function () { return "Нема пронајдено совпаѓања"; },
|
||||
formatInputTooShort: function (input, min) { var n = min - input.length; return "Ве молиме внесете уште " + n + " карактер" + (n == 1 ? "" : "и"); },
|
||||
formatInputTooLong: function (input, max) { var n = input.length - max; return "Ве молиме внесете " + n + " помалку карактер" + (n == 1? "" : "и"); },
|
||||
formatSelectionTooBig: function (limit) { return "Можете да изберете само " + limit + " ставк" + (limit == 1 ? "а" : "и"); },
|
||||
formatLoadMore: function (pageNumber) { return "Вчитување резултати…"; },
|
||||
formatSearching: function () { return "Пребарување…"; }
|
||||
};
|
||||
|
||||
$.extend($.fn.select2.defaults, $.fn.select2.locales['mk']);
|
||||
})(jQuery);
|
||||
19
static/cms/js/select2/select2_locale_ms.js
vendored
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
/**
|
||||
* Select2 Malay translation.
|
||||
*
|
||||
* Author: Kepoweran <kepoweran@gmail.com>
|
||||
*/
|
||||
(function ($) {
|
||||
"use strict";
|
||||
|
||||
$.fn.select2.locales['ms'] = {
|
||||
formatNoMatches: function () { return "Tiada padanan yang ditemui"; },
|
||||
formatInputTooShort: function (input, min) { var n = min - input.length; return "Sila masukkan " + n + " aksara lagi"; },
|
||||
formatInputTooLong: function (input, max) { var n = input.length - max; return "Sila hapuskan " + n + " aksara"; },
|
||||
formatSelectionTooBig: function (limit) { return "Anda hanya boleh memilih " + limit + " pilihan"; },
|
||||
formatLoadMore: function (pageNumber) { return "Sedang memuatkan keputusan…"; },
|
||||
formatSearching: function () { return "Mencari…"; }
|
||||
};
|
||||
|
||||
$.extend($.fn.select2.defaults, $.fn.select2.locales['ms']);
|
||||
})(jQuery);
|
||||
17
static/cms/js/select2/select2_locale_nl.js
vendored
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
/**
|
||||
* Select2 Dutch translation
|
||||
*/
|
||||
(function ($) {
|
||||
"use strict";
|
||||
|
||||
$.fn.select2.locales['nl'] = {
|
||||
formatNoMatches: function () { return "Geen resultaten gevonden"; },
|
||||
formatInputTooShort: function (input, min) { var n = min - input.length; return "Vul nog " + n + " karakter" + (n == 1? "" : "s") + " in"; },
|
||||
formatInputTooLong: function (input, max) { var n = input.length - max; return "Haal " + n + " karakter" + (n == 1? "" : "s") + " weg"; },
|
||||
formatSelectionTooBig: function (limit) { return "Maximaal " + limit + " item" + (limit == 1 ? "" : "s") + " toegestaan"; },
|
||||
formatLoadMore: function (pageNumber) { return "Meer resultaten laden…"; },
|
||||
formatSearching: function () { return "Zoeken…"; }
|
||||
};
|
||||
|
||||
$.extend($.fn.select2.defaults, $.fn.select2.locales['nl']);
|
||||
})(jQuery);
|
||||
20
static/cms/js/select2/select2_locale_no.js
vendored
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
/**
|
||||
* Select2 Norwegian translation.
|
||||
*
|
||||
* Author: Torgeir Veimo <torgeir.veimo@gmail.com>
|
||||
*/
|
||||
(function ($) {
|
||||
"use strict";
|
||||
|
||||
$.fn.select2.locales['no'] = {
|
||||
formatNoMatches: function () { return "Ingen treff"; },
|
||||
formatInputTooShort: function (input, min) { var n = min - input.length; return "Vennligst skriv inn " + n + (n>1 ? " flere tegn" : " tegn til"); },
|
||||
formatInputTooLong: function (input, max) { var n = input.length - max; return "Vennligst fjern " + n + " tegn"; },
|
||||
formatSelectionTooBig: function (limit) { return "Du kan velge maks " + limit + " elementer"; },
|
||||
formatLoadMore: function (pageNumber) { return "Laster flere resultater…"; },
|
||||
formatSearching: function () { return "Søker…"; }
|
||||
};
|
||||
|
||||
$.extend($.fn.select2.defaults, $.fn.select2.locales['no']);
|
||||
})(jQuery);
|
||||
|
||||
25
static/cms/js/select2/select2_locale_pl.js
vendored
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
/**
|
||||
* Select2 Polish translation.
|
||||
*
|
||||
* @author Jan Kondratowicz <jan@kondratowicz.pl>
|
||||
* @author Uriy Efremochkin <efremochkin@uriy.me>
|
||||
* @author Michał Połtyn <mike@poltyn.com>
|
||||
*/
|
||||
(function ($) {
|
||||
"use strict";
|
||||
|
||||
$.fn.select2.locales['pl'] = {
|
||||
formatNoMatches: function () { return "Brak wyników"; },
|
||||
formatInputTooShort: function (input, min) { return "Wpisz co najmniej" + character(min - input.length, "znak", "i"); },
|
||||
formatInputTooLong: function (input, max) { return "Wpisana fraza jest za długa o" + character(input.length - max, "znak", "i"); },
|
||||
formatSelectionTooBig: function (limit) { return "Możesz zaznaczyć najwyżej" + character(limit, "element", "y"); },
|
||||
formatLoadMore: function (pageNumber) { return "Ładowanie wyników…"; },
|
||||
formatSearching: function () { return "Szukanie…"; }
|
||||
};
|
||||
|
||||
$.extend($.fn.select2.defaults, $.fn.select2.locales['pl']);
|
||||
|
||||
function character (n, word, pluralSuffix) {
|
||||
return " " + n + " " + word + (n == 1 ? "" : n%10 < 5 && n%10 > 1 && (n%100 < 5 || n%100 > 20) ? pluralSuffix : "ów");
|
||||
}
|
||||
})(jQuery);
|
||||
17
static/cms/js/select2/select2_locale_pt-BR.js
vendored
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
/**
|
||||
* Select2 Brazilian Portuguese translation
|
||||
*/
|
||||
(function ($) {
|
||||
"use strict";
|
||||
|
||||
$.fn.select2.locales['pt-BR'] = {
|
||||
formatNoMatches: function () { return "Nenhum resultado encontrado"; },
|
||||
formatInputTooShort: function (input, min) { var n = min - input.length; return "Digite mais " + n + " caracter" + (n == 1? "" : "es"); },
|
||||
formatInputTooLong: function (input, max) { var n = input.length - max; return "Apague " + n + " caracter" + (n == 1? "" : "es"); },
|
||||
formatSelectionTooBig: function (limit) { return "Só é possível selecionar " + limit + " elemento" + (limit == 1 ? "" : "s"); },
|
||||
formatLoadMore: function (pageNumber) { return "Carregando mais resultados…"; },
|
||||
formatSearching: function () { return "Buscando…"; }
|
||||
};
|
||||
|
||||
$.extend($.fn.select2.defaults, $.fn.select2.locales['pt-BR']);
|
||||
})(jQuery);
|
||||
17
static/cms/js/select2/select2_locale_pt-PT.js
vendored
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
/**
|
||||
* Select2 Portuguese (Portugal) translation
|
||||
*/
|
||||
(function ($) {
|
||||
"use strict";
|
||||
|
||||
$.fn.select2.locales['pt-PT'] = {
|
||||
formatNoMatches: function () { return "Nenhum resultado encontrado"; },
|
||||
formatInputTooShort: function (input, min) { var n = min - input.length; return "Introduza " + n + " car" + (n == 1 ? "ácter" : "acteres"); },
|
||||
formatInputTooLong: function (input, max) { var n = input.length - max; return "Apague " + n + " car" + (n == 1 ? "ácter" : "acteres"); },
|
||||
formatSelectionTooBig: function (limit) { return "Só é possível selecionar " + limit + " elemento" + (limit == 1 ? "" : "s"); },
|
||||
formatLoadMore: function (pageNumber) { return "A carregar mais resultados…"; },
|
||||
formatSearching: function () { return "A pesquisar…"; }
|
||||
};
|
||||
|
||||
$.extend($.fn.select2.defaults, $.fn.select2.locales['pt-PT']);
|
||||
})(jQuery);
|
||||
17
static/cms/js/select2/select2_locale_ro.js
vendored
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
/**
|
||||
* Select2 Romanian translation.
|
||||
*/
|
||||
(function ($) {
|
||||
"use strict";
|
||||
|
||||
$.fn.select2.locales['ro'] = {
|
||||
formatNoMatches: function () { return "Nu a fost găsit nimic"; },
|
||||
formatInputTooShort: function (input, min) { var n = min - input.length; return "Vă rugăm să introduceți incă " + n + " caracter" + (n == 1 ? "" : "e"); },
|
||||
formatInputTooLong: function (input, max) { var n = input.length - max; return "Vă rugăm să introduceți mai puțin de " + n + " caracter" + (n == 1? "" : "e"); },
|
||||
formatSelectionTooBig: function (limit) { return "Aveți voie să selectați cel mult " + limit + " element" + (limit == 1 ? "" : "e"); },
|
||||
formatLoadMore: function (pageNumber) { return "Se încarcă…"; },
|
||||
formatSearching: function () { return "Căutare…"; }
|
||||
};
|
||||
|
||||
$.extend($.fn.select2.defaults, $.fn.select2.locales['ro']);
|
||||
})(jQuery);
|
||||
19
static/cms/js/select2/select2_locale_rs.js
vendored
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
/**
|
||||
* Select2 Serbian translation.
|
||||
*
|
||||
* @author Limon Monte <limon.monte@gmail.com>
|
||||
*/
|
||||
(function ($) {
|
||||
"use strict";
|
||||
|
||||
$.fn.select2.locales['rs'] = {
|
||||
formatNoMatches: function () { return "Ništa nije pronađeno"; },
|
||||
formatInputTooShort: function (input, min) { var n = min - input.length; return "Ukucajte bar još " + n + " simbol" + (n % 10 == 1 && n % 100 != 11 ? "" : "a"); },
|
||||
formatInputTooLong: function (input, max) { var n = input.length - max; return "Obrišite " + n + " simbol" + (n % 10 == 1 && n % 100 != 11 ? "" : "a"); },
|
||||
formatSelectionTooBig: function (limit) { return "Možete izabrati samo " + limit + " stavk" + (limit % 10 == 1 && limit % 100 != 11 ? "u" : (limit % 10 >= 2 && limit % 10 <= 4 && (limit % 100 < 12 || limit % 100 > 14)? "e" : "i")); },
|
||||
formatLoadMore: function (pageNumber) { return "Preuzimanje još rezultata…"; },
|
||||
formatSearching: function () { return "Pretraga…"; }
|
||||
};
|
||||
|
||||
$.extend($.fn.select2.defaults, $.fn.select2.locales['rs']);
|
||||
})(jQuery);
|
||||
23
static/cms/js/select2/select2_locale_ru.js
vendored
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
/**
|
||||
* Select2 Russian translation.
|
||||
*
|
||||
* @author Uriy Efremochkin <efremochkin@uriy.me>
|
||||
*/
|
||||
(function ($) {
|
||||
"use strict";
|
||||
|
||||
$.fn.select2.locales['ru'] = {
|
||||
formatNoMatches: function () { return "Совпадений не найдено"; },
|
||||
formatInputTooShort: function (input, min) { return "Пожалуйста, введите еще хотя бы" + character(min - input.length); },
|
||||
formatInputTooLong: function (input, max) { return "Пожалуйста, введите на" + character(input.length - max) + " меньше"; },
|
||||
formatSelectionTooBig: function (limit) { return "Вы можете выбрать не более " + limit + " элемент" + (limit%10 == 1 && limit%100 != 11 ? "а" : "ов"); },
|
||||
formatLoadMore: function (pageNumber) { return "Загрузка данных…"; },
|
||||
formatSearching: function () { return "Поиск…"; }
|
||||
};
|
||||
|
||||
$.extend($.fn.select2.defaults, $.fn.select2.locales['ru']);
|
||||
|
||||
function character (n) {
|
||||
return " " + n + " символ" + (n%10 < 5 && n%10 > 0 && (n%100 < 5 || n%100 > 20) ? n%10 > 1 ? "a" : "" : "ов");
|
||||
}
|
||||
})(jQuery);
|
||||
50
static/cms/js/select2/select2_locale_sk.js
vendored
Normal file
|
|
@ -0,0 +1,50 @@
|
|||
/**
|
||||
* Select2 Slovak translation.
|
||||
*
|
||||
* Author: David Vallner <david@vallner.net>
|
||||
*/
|
||||
(function ($) {
|
||||
"use strict";
|
||||
// use text for the numbers 2 through 4
|
||||
var smallNumbers = {
|
||||
2: function(masc) { return (masc ? "dva" : "dve"); },
|
||||
3: function() { return "tri"; },
|
||||
4: function() { return "štyri"; }
|
||||
};
|
||||
$.fn.select2.locales['sk'] = {
|
||||
formatNoMatches: function () { return "Nenašli sa žiadne položky"; },
|
||||
formatInputTooShort: function (input, min) {
|
||||
var n = min - input.length;
|
||||
if (n == 1) {
|
||||
return "Prosím, zadajte ešte jeden znak";
|
||||
} else if (n <= 4) {
|
||||
return "Prosím, zadajte ešte ďalšie "+smallNumbers[n](true)+" znaky";
|
||||
} else {
|
||||
return "Prosím, zadajte ešte ďalších "+n+" znakov";
|
||||
}
|
||||
},
|
||||
formatInputTooLong: function (input, max) {
|
||||
var n = input.length - max;
|
||||
if (n == 1) {
|
||||
return "Prosím, zadajte o jeden znak menej";
|
||||
} else if (n <= 4) {
|
||||
return "Prosím, zadajte o "+smallNumbers[n](true)+" znaky menej";
|
||||
} else {
|
||||
return "Prosím, zadajte o "+n+" znakov menej";
|
||||
}
|
||||
},
|
||||
formatSelectionTooBig: function (limit) {
|
||||
if (limit == 1) {
|
||||
return "Môžete zvoliť len jednu položku";
|
||||
} else if (limit <= 4) {
|
||||
return "Môžete zvoliť najviac "+smallNumbers[limit](false)+" položky";
|
||||
} else {
|
||||
return "Môžete zvoliť najviac "+limit+" položiek";
|
||||
}
|
||||
},
|
||||
formatLoadMore: function (pageNumber) { return "Načítavajú sa ďalšie výsledky…"; },
|
||||
formatSearching: function () { return "Vyhľadávanie…"; }
|
||||
};
|
||||
|
||||
$.extend($.fn.select2.defaults, $.fn.select2.locales['sk']);
|
||||
})(jQuery);
|
||||
19
static/cms/js/select2/select2_locale_sv.js
vendored
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
/**
|
||||
* Select2 Swedish translation.
|
||||
*
|
||||
* Author: Jens Rantil <jens.rantil@telavox.com>
|
||||
*/
|
||||
(function ($) {
|
||||
"use strict";
|
||||
|
||||
$.fn.select2.locales['sv'] = {
|
||||
formatNoMatches: function () { return "Inga träffar"; },
|
||||
formatInputTooShort: function (input, min) { var n = min - input.length; return "Var god skriv in " + n + (n>1 ? " till tecken" : " tecken till"); },
|
||||
formatInputTooLong: function (input, max) { var n = input.length - max; return "Var god sudda ut " + n + " tecken"; },
|
||||
formatSelectionTooBig: function (limit) { return "Du kan max välja " + limit + " element"; },
|
||||
formatLoadMore: function (pageNumber) { return "Laddar fler resultat…"; },
|
||||
formatSearching: function () { return "Söker…"; }
|
||||
};
|
||||
|
||||
$.extend($.fn.select2.defaults, $.fn.select2.locales['sv']);
|
||||
})(jQuery);
|
||||