Replace portal js by coffee (#595)
This commit is contained in:
parent
a65e1f6f0a
commit
1be5361439
16
Makefile
16
Makefile
|
@ -186,13 +186,17 @@ MANAGERJSONDST=$(SRCMANAGERDIR)/site/static/struct.json \
|
||||||
_example/conf/lmConf-1.js
|
_example/conf/lmConf-1.js
|
||||||
|
|
||||||
# Javascript and CSS to minify
|
# Javascript and CSS to minify
|
||||||
JSSRCFILES:=$(shell find */site/static/js $(SRCPORTALDIR)/example -type f -name '*.js' ! -name '*.min.js') \
|
JSSRCFILES:=$(shell find */site/static/js $(SRCPORTALDIR)/site/htdocs/static/common/js -type f -name '*.js' ! -name '*.min.js') \
|
||||||
$(SRCMANAGERDIR)/site/static/bwr/file-saver.js/FileSaver.js
|
$(SRCMANAGERDIR)/site/static/bwr/file-saver.js/FileSaver.js
|
||||||
CSSSRCFILES:=$(shell find */site/static/css $(SRCPORTALDIR)/example -type f -name '*.css' ! -name '*.min.css')
|
CSSSRCFILES:=$(shell find */site/static/css $(SRCPORTALDIR)/site/htdocs/static/common/css -type f -name '*.css' ! -name '*.min.css')
|
||||||
|
|
||||||
# Coffee files
|
# Coffee files
|
||||||
COFFEESRCFILES:=$(shell find */site/coffee/ -type f -name '*.coffee')
|
MANAGERCOFFEESRCFILES:=$(shell find lemonldap-ng-manager/site/coffee -type f -name '*.coffee')
|
||||||
COFFEEDSTFILES:=$(subst coffee/,static/js/,$(COFFEESRCFILES:.coffee=.js))
|
PORTALCOFFEESRCFILES:=$(shell find lemonldap-ng-portal/site/coffee -type f -name '*.coffee')
|
||||||
|
COFFEESRCFILES=$(MANAGERCOFFEESRCFILES) $(PORTALCOFFEESRCFILES)
|
||||||
|
MANAGERCOFFEEDSTFILES:=$(subst coffee/,static/js/,$(MANAGERCOFFEESRCFILES:.coffee=.js))
|
||||||
|
PORTALCOFFEEDSTFILES:=$(subst coffee/,htdocs/static/common/js/,$(PORTALCOFFEESRCFILES:.coffee=.js))
|
||||||
|
COFFEEDSTFILES:=$(MANAGERCOFFEEDSTFILES) $(PORTALCOFFEEDSTFILES)
|
||||||
|
|
||||||
# Minified files
|
# Minified files
|
||||||
JSDSTFILES=$(JSSRCFILES:.js=.min.js)
|
JSDSTFILES=$(JSSRCFILES:.js=.min.js)
|
||||||
|
@ -264,10 +268,10 @@ js: $(COFFEEDSTFILES)
|
||||||
|
|
||||||
minify: js $(JSDSTFILES) $(CSSDSTFILES)
|
minify: js $(JSDSTFILES) $(CSSDSTFILES)
|
||||||
|
|
||||||
$(SRCPORTALDIR)/site/static/js/%.js: $(SRCPORTALDIR)/site/coffee/%.coffee
|
$(SRCPORTALDIR)/site/htdocs/static/common/js/%.js: $(SRCPORTALDIR)/site/coffee/%.coffee
|
||||||
@if which coffee >/dev/null; then \
|
@if which coffee >/dev/null; then \
|
||||||
echo "Compiling $(SRCPORTALDIR)/site/coffee/$*.coffee"; \
|
echo "Compiling $(SRCPORTALDIR)/site/coffee/$*.coffee"; \
|
||||||
coffee -c -o $(SRCPORTALDIR)/site/static/js/ $(SRCPORTALDIR)/site/coffee/$*.coffee; \
|
coffee -c -o $(SRCPORTALDIR)/site/htdocs/static/common/js/ $(SRCPORTALDIR)/site/coffee/$*.coffee; \
|
||||||
fi
|
fi
|
||||||
|
|
||||||
$(SRCMANAGERDIR)/site/static/js/%.js: $(SRCMANAGERDIR)/site/coffee/%.coffee
|
$(SRCMANAGERDIR)/site/static/js/%.js: $(SRCMANAGERDIR)/site/coffee/%.coffee
|
||||||
|
|
|
@ -97,6 +97,8 @@ ping = ->
|
||||||
else
|
else
|
||||||
location.reload true
|
location.reload true
|
||||||
|
|
||||||
|
window.ping = ping
|
||||||
|
|
||||||
# Initialization
|
# Initialization
|
||||||
$(document).ready ->
|
$(document).ready ->
|
||||||
if antiframe and top != self
|
if antiframe and top != self
|
||||||
|
|
|
@ -1,218 +1,153 @@
|
||||||
/**
|
// Generated by CoffeeScript 1.10.0
|
||||||
* LemonLDAP::NG Portal jQuery scripts
|
|
||||||
|
/*
|
||||||
|
LemonLDAP::NG Portal jQuery scripts
|
||||||
|
|
||||||
|
Used variables:
|
||||||
|
- displaytab
|
||||||
|
- choicetab
|
||||||
|
- login
|
||||||
|
- newwindow
|
||||||
|
- antiframe
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Used variables
|
(function() {
|
||||||
* - displaytab
|
var activeTimer, antiframe, getOrder, isHiddenFormValueSet, newwindow, ping, restoreOrder, setSelector, translate, translatePage,
|
||||||
* - choicetab
|
indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
|
||||||
* - login
|
|
||||||
* - newwindow
|
|
||||||
* - antiframe
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Set newwindow value (default is false) */
|
translatePage = function(lang) {
|
||||||
if (newwindow.match('1')) {
|
return $("[trspan]").each(function() {
|
||||||
newwindow = true;
|
return this.text(translate(this.attr('trspan')));
|
||||||
} else {
|
|
||||||
newwindow = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Set antiframe value (default is true) */
|
|
||||||
if (antiframe.match('0')) {
|
|
||||||
antiframe = false;
|
|
||||||
} else {
|
|
||||||
antiframe = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Set activeTimer value (default is true) */
|
|
||||||
if (activeTimer.match('0')) {
|
|
||||||
activeTimer = false;
|
|
||||||
} else {
|
|
||||||
activeTimer = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* jQuery */
|
|
||||||
$(document).ready(function() {
|
|
||||||
|
|
||||||
/* AntiFrame script */
|
|
||||||
if (antiframe && top != self) {
|
|
||||||
top.location.href = location.href;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Sortable menu */
|
|
||||||
$("#appslist").sortable({
|
|
||||||
axis: "y",
|
|
||||||
cursor: "move",
|
|
||||||
opacity: 0.5,
|
|
||||||
revert: true,
|
|
||||||
items: "> div.category",
|
|
||||||
update: function() {
|
|
||||||
getOrder();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
restoreOrder();
|
|
||||||
|
|
||||||
/* Display message */
|
|
||||||
$("div.message").fadeIn('slow');
|
|
||||||
|
|
||||||
/* Set timezone */
|
|
||||||
$("input[name=timezone]").val(-(new Date().getTimezoneOffset() / 60));
|
|
||||||
|
|
||||||
/* Menu tabs */
|
|
||||||
var menuTabs = $("#menu").tabs({
|
|
||||||
active: 0
|
|
||||||
});
|
|
||||||
var menuIndex = $('#menu a[href="#' + displaytab + '"]').parent().index();
|
|
||||||
if (menuIndex < 0) {
|
|
||||||
menuIndex = 0;
|
|
||||||
}
|
|
||||||
menuTabs.tabs("option", "active", menuIndex);
|
|
||||||
|
|
||||||
/* Authentication choice tabs */
|
|
||||||
var authMenuTabs = $("#authMenu").tabs({
|
|
||||||
active: 0
|
|
||||||
});
|
|
||||||
// TODO: cookie
|
|
||||||
//$("#authMenu").tabs({cookie: {name: 'lemonldapauthchoice'}});
|
|
||||||
if (choicetab) {
|
|
||||||
var authMenuIndex = $('#authMenu a[href="#' + choicetab + '"]').parent().index();
|
|
||||||
authMenuTabs.tabs("option", "active", authMenuIndex);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Focus on first visible input */
|
|
||||||
$("input[type!=hidden]:first").focus();
|
|
||||||
if (login) {
|
|
||||||
$("input[type=password]:first").focus();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Open links in new windows */
|
|
||||||
if (newwindow) {
|
|
||||||
$('#appslist a').attr("target", "_blank");
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Complete removeOther link */
|
|
||||||
if ($("p.removeOther").length) {
|
|
||||||
var action = $("form.login").attr("action");
|
|
||||||
var method = $("form.login").attr("method");
|
|
||||||
|
|
||||||
var back_url = "";
|
|
||||||
if (action.indexOf("?") != -1) {
|
|
||||||
back_url = action.substring(0, action.indexOf("?")) + "?";
|
|
||||||
} else {
|
|
||||||
back_url = action + "?";
|
|
||||||
}
|
|
||||||
|
|
||||||
$("form.login input[type=hidden]").each(function(index) {
|
|
||||||
back_url = back_url + "&" + $(this).attr("name") + "=" + $(this).val();
|
|
||||||
});
|
});
|
||||||
|
};
|
||||||
|
|
||||||
var link = $("p.removeOther a").attr("href");
|
translate = function(str) {};
|
||||||
|
|
||||||
link = link + "&method=" + method + "&url=" + $.base64Encode(back_url);
|
newwindow = window.newwindow.match('1') ? true : false;
|
||||||
|
|
||||||
$("p.removeOther a").attr("href", link);
|
antiframe = window.antiframe.match('0') ? false : true;
|
||||||
|
|
||||||
}
|
activeTimer = window.activeTimer.match('0') ? false : true;
|
||||||
});
|
|
||||||
|
|
||||||
/* Code from http://snipplr.com/view/29434/ */
|
setSelector = "#appslist";
|
||||||
// set the list selector
|
|
||||||
var setSelector = "#appslist";
|
|
||||||
// function that writes the list order to session
|
|
||||||
function getOrder() {
|
|
||||||
// save custom order to persistent session
|
|
||||||
$.ajax({
|
|
||||||
type: "POST",
|
|
||||||
url: scriptname,
|
|
||||||
data: {
|
|
||||||
storeAppsListOrder: $(setSelector).sortable("toArray").join()
|
|
||||||
},
|
|
||||||
dataType: 'json'
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// function that restores the list order from session
|
getOrder = function() {
|
||||||
function restoreOrder() {
|
return $.ajax({
|
||||||
var list = $(setSelector);
|
type: "POST",
|
||||||
if (list == null) return;
|
url: scriptname,
|
||||||
|
data: {
|
||||||
|
storeAppsListOrder: $(setSelector).sortable("toArray").join()
|
||||||
|
},
|
||||||
|
dataType: 'json'
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
// fetch the session value (saved order)
|
restoreOrder = function() {
|
||||||
if (!appslistorder) return;
|
var IDs, child, i, item, itemID, items, j, len, len1, list, rebuild, savedOrd, v;
|
||||||
|
list = $(setSelector);
|
||||||
// make array from saved order
|
if (!((list != null) && appslistorder)) {
|
||||||
var IDs = appslistorder.split(",");
|
return null;
|
||||||
|
|
||||||
// fetch current order
|
|
||||||
var items = list.sortable("toArray");
|
|
||||||
|
|
||||||
// make array from current order
|
|
||||||
var rebuild = new Array();
|
|
||||||
for (var v = 0, len = items.length; v < len; v++) {
|
|
||||||
rebuild[items[v]] = items[v];
|
|
||||||
}
|
|
||||||
|
|
||||||
for (var i = 0, n = IDs.length; i < n; i++) {
|
|
||||||
|
|
||||||
// item id from saved order
|
|
||||||
var itemID = IDs[i];
|
|
||||||
|
|
||||||
if (itemID in rebuild) {
|
|
||||||
|
|
||||||
// select item id from current order
|
|
||||||
var item = rebuild[itemID];
|
|
||||||
|
|
||||||
// select the item according to current order
|
|
||||||
var child = $(setSelector + ".ui-sortable").children("#" + item);
|
|
||||||
|
|
||||||
// select the item according to the saved order
|
|
||||||
var savedOrd = $(setSelector + ".ui-sortable").children("#" + itemID);
|
|
||||||
|
|
||||||
// remove all the items
|
|
||||||
child.remove();
|
|
||||||
|
|
||||||
// add the items in turn according to saved order
|
|
||||||
// we need to filter here since the "ui-sortable"
|
|
||||||
// class is applied to all ul elements and we
|
|
||||||
// only want the very first! You can modify this
|
|
||||||
// to support multiple lists - not tested!
|
|
||||||
$(setSelector + ".ui-sortable").filter(":first").append(savedOrd);
|
|
||||||
}
|
}
|
||||||
}
|
IDs = appslistorder.split(',');
|
||||||
}
|
items = list.sortable("toArray");
|
||||||
|
rebuild = [];
|
||||||
/* function boolean isHiddenFormValueSet(string option)
|
for (i = 0, len = items.length; i < len; i++) {
|
||||||
* Check if an hidden option is set
|
v = items[i];
|
||||||
* @param option Option name
|
rebuild[v] = v;
|
||||||
* @return true if option is set, false else
|
}
|
||||||
*/
|
for (j = 0, len1 = IDs.length; j < len1; j++) {
|
||||||
function isHiddenFormValueSet(option) {
|
itemID = IDs[j];
|
||||||
if ($('#lmhidden_' + option).length) {
|
if (indexOf.call(rebuild, itemID) >= 0) {
|
||||||
return true;
|
item = rebuild[itemID];
|
||||||
} else {
|
child = $(setSelector + ".ui-sortable").children("#" + item);
|
||||||
return false;
|
savedOrd = $(setSelector + ".ui-sortable").children("#" + itemID);
|
||||||
}
|
child.remove();
|
||||||
}
|
$(setSelector + ".ui-sortable").filter(":first").append(savedOrd);
|
||||||
|
|
||||||
/* function void ping()
|
|
||||||
* Check if session is alive on server side
|
|
||||||
* @return nothing
|
|
||||||
*/
|
|
||||||
function ping() {
|
|
||||||
$.ajax({
|
|
||||||
type: "POST",
|
|
||||||
url: scriptname,
|
|
||||||
data: {
|
|
||||||
ping: 1
|
|
||||||
},
|
|
||||||
dataType: 'json',
|
|
||||||
success: function(data) {
|
|
||||||
if (!data.auth) {
|
|
||||||
location.reload(true);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
setTimeout('ping();', pingInterval);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return 1;
|
||||||
|
};
|
||||||
|
|
||||||
|
isHiddenFormValueSet = function(option) {
|
||||||
|
return $('#lmhidden_' + option).length;
|
||||||
|
};
|
||||||
|
|
||||||
|
ping = function() {
|
||||||
|
return $.ajax({
|
||||||
|
type: "POST",
|
||||||
|
url: scriptname,
|
||||||
|
data: {
|
||||||
|
ping: 1
|
||||||
|
},
|
||||||
|
dataType: 'json',
|
||||||
|
success: function(data) {
|
||||||
|
if (data.auth) {
|
||||||
|
return setTimeout('ping();', pingInterval);
|
||||||
|
} else {
|
||||||
|
return location.reload(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
window.ping = ping;
|
||||||
|
|
||||||
|
$(document).ready(function() {
|
||||||
|
var action, authMenuTabs, back_url, link, menuIndex, menuTabs, method;
|
||||||
|
if (antiframe && top !== self) {
|
||||||
|
top.location.href = location.href;
|
||||||
|
}
|
||||||
|
$("#appslist").sortable({
|
||||||
|
axis: "y",
|
||||||
|
cursor: "move",
|
||||||
|
opacity: 0.5,
|
||||||
|
revert: true,
|
||||||
|
items: "> div.category",
|
||||||
|
update: function() {
|
||||||
|
return getOrder();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
restoreOrder();
|
||||||
|
$("div.message").fadeIn('slow');
|
||||||
|
$("input[name=timezone]").val(-(new Date().getTimezoneOffset() / 60));
|
||||||
|
menuTabs = $("#menu").tabs({
|
||||||
|
active: 0
|
||||||
|
});
|
||||||
|
menuIndex = $('#menu a[href="#' + displaytab + '"]').parent().index();
|
||||||
|
if (menuIndex < 0) {
|
||||||
|
menuIndex = 0;
|
||||||
|
}
|
||||||
|
menuTabs.tabs("option", "active", menuIndex);
|
||||||
|
authMenuTabs = $("#authMenu").tabs({
|
||||||
|
active: 0
|
||||||
|
});
|
||||||
|
if (choicetab) {
|
||||||
|
authMenuTabs.tabs("option", "active", $('#authMenu a[href="#' + choicetab + '"]').parent().index());
|
||||||
|
}
|
||||||
|
if (login) {
|
||||||
|
$("input[type=password]:first").focus();
|
||||||
|
} else {
|
||||||
|
$("input[type!=hidden]:first").focus();
|
||||||
|
}
|
||||||
|
if (newwindow) {
|
||||||
|
$('#appslist a').attr("target", "_blank");
|
||||||
|
}
|
||||||
|
if ($("p.removeOther").length) {
|
||||||
|
action = $("form.login").attr("action");
|
||||||
|
method = $("form.login").attr("method");
|
||||||
|
back_url = "";
|
||||||
|
if (action.indexOf("?") !== -1) {
|
||||||
|
action.substring(0, action.indexOf("?")) + "?";
|
||||||
|
} else {
|
||||||
|
back_url = action + "?";
|
||||||
|
}
|
||||||
|
$("form.login input[type=hidden]").each(function(index) {
|
||||||
|
return back_url += "&" + $(this).attr("name") + "=" + $(this).val();
|
||||||
|
});
|
||||||
|
link = $("p.removeOther a").attr("href") + "&method=" + method + "&url=" + btoa(back_url);
|
||||||
|
$("p.removeOther a").attr("href", link);
|
||||||
|
}
|
||||||
|
return translatePage(lang);
|
||||||
});
|
});
|
||||||
}
|
|
||||||
|
}).call(this);
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
if(newwindow.match("1")){newwindow=true}else{newwindow=false}if(antiframe.match("0")){antiframe=false}else{antiframe=true}if(activeTimer.match("0")){activeTimer=false}else{activeTimer=true}$(document).ready(function(){if(antiframe&&top!=self){top.location.href=location.href}$("#appslist").sortable({axis:"y",cursor:"move",opacity:0.5,revert:true,items:"> div.category",update:function(){getOrder()}});restoreOrder();$("div.message").fadeIn("slow");$("input[name=timezone]").val(-(new Date().getTimezoneOffset()/60));var b=$("#menu").tabs({active:0});var e=$('#menu a[href="#'+displaytab+'"]').parent().index();if(e<0){e=0}b.tabs("option","active",e);var a=$("#authMenu").tabs({active:0});if(choicetab){var d=$('#authMenu a[href="#'+choicetab+'"]').parent().index();a.tabs("option","active",d)}$("input[type!=hidden]:first").focus();if(login){$("input[type=password]:first").focus()}if(newwindow){$("#appslist a").attr("target","_blank")}if($("p.removeOther").length){var g=$("form.login").attr("action");var h=$("form.login").attr("method");var c="";if(g.indexOf("?")!=-1){c=g.substring(0,g.indexOf("?"))+"?"}else{c=g+"?"}$("form.login input[type=hidden]").each(function(i){c=c+"&"+$(this).attr("name")+"="+$(this).val()});var f=$("p.removeOther a").attr("href");f=f+"&method="+h+"&url="+$.base64Encode(c);$("p.removeOther a").attr("href",f)}});var setSelector="#appslist";function getOrder(){$.ajax({type:"POST",url:scriptname,data:{storeAppsListOrder:$(setSelector).sortable("toArray").join()},dataType:"json"})}function restoreOrder(){var h=$(setSelector);if(h==null){return}if(!appslistorder){return}var d=appslistorder.split(",");var j=h.sortable("toArray");var k=new Array();for(var l=0,f=j.length;l<f;l++){k[j[l]]=j[l]}for(var e=0,c=d.length;e<c;e++){var a=d[e];if(a in k){var m=k[a];var b=$(setSelector+".ui-sortable").children("#"+m);var g=$(setSelector+".ui-sortable").children("#"+a);b.remove();$(setSelector+".ui-sortable").filter(":first").append(g)}}}function isHiddenFormValueSet(a){if($("#lmhidden_"+a).length){return true}else{return false}}function ping(){$.ajax({type:"POST",url:scriptname,data:{ping:1},dataType:"json",success:function(a){if(!a.auth){location.reload(true)}else{setTimeout("ping();",pingInterval)}}})};
|
(function(){var c,d,i,a,g,j,h,e,b,k,f=[].indexOf||function(o){for(var n=0,m=this.length;n<m;n++){if(n in this&&this[n]===o){return n}}return -1};k=function(l){return $("[trspan]").each(function(){return this.text(b(this.attr("trspan")))})};b=function(l){};g=window.newwindow.match("1")?true:false;d=window.antiframe.match("0")?false:true;c=window.activeTimer.match("0")?false:true;e="#appslist";i=function(){return $.ajax({type:"POST",url:scriptname,data:{storeAppsListOrder:$(e).sortable("toArray").join()},dataType:"json"})};h=function(){var n,m,q,y,l,u,p,r,o,t,w,s,x;t=$(e);if(!((t!=null)&&appslistorder)){return null}n=appslistorder.split(",");u=t.sortable("toArray");w=[];for(q=0,r=u.length;q<r;q++){x=u[q];w[x]=x}for(p=0,o=n.length;p<o;p++){l=n[p];if(f.call(w,l)>=0){y=w[l];m=$(e+".ui-sortable").children("#"+y);s=$(e+".ui-sortable").children("#"+l);m.remove();$(e+".ui-sortable").filter(":first").append(s)}}return 1};a=function(l){return $("#lmhidden_"+l).length};j=function(){return $.ajax({type:"POST",url:scriptname,data:{ping:1},dataType:"json",success:function(l){if(l.auth){return setTimeout("ping();",pingInterval)}else{return location.reload(true)}}})};window.ping=j;$(document).ready(function(){var q,m,n,p,o,l,r;if(d&&top!==self){top.location.href=location.href}$("#appslist").sortable({axis:"y",cursor:"move",opacity:0.5,revert:true,items:"> div.category",update:function(){return i()}});h();$("div.message").fadeIn("slow");$("input[name=timezone]").val(-(new Date().getTimezoneOffset()/60));l=$("#menu").tabs({active:0});o=$('#menu a[href="#'+displaytab+'"]').parent().index();if(o<0){o=0}l.tabs("option","active",o);m=$("#authMenu").tabs({active:0});if(choicetab){m.tabs("option","active",$('#authMenu a[href="#'+choicetab+'"]').parent().index())}if(login){$("input[type=password]:first").focus()}else{$("input[type!=hidden]:first").focus()}if(g){$("#appslist a").attr("target","_blank")}if($("p.removeOther").length){q=$("form.login").attr("action");r=$("form.login").attr("method");n="";if(q.indexOf("?")!==-1){q.substring(0,q.indexOf("?"))+"?"}else{n=q+"?"}$("form.login input[type=hidden]").each(function(s){return n+="&"+$(this).attr("name")+"="+$(this).val()});p=$("p.removeOther a").attr("href")+"&method="+r+"&url="+btoa(n);$("p.removeOther a").attr("href",p)}return k(lang)})}).call(this);
|
Loading…
Reference in New Issue
Block a user