/*
* @$Header: /var/cvsroot/reconfig/js/jquery.reconfig-1.0.js,v 1.4 2014/11/10 12:34:31 giuseppe Exp $
*
* Date: 21 Feb 2012
*/
(function ($) {
$.fn.reconfig = function (options) {
/** if you don't specify any 'target' option take '$reconfig' as default: to set a new object (i.e.):
exampledata = { settings: { items: null }};
$('#samplediv').reconfig({target:exampledata,action: ['exec','build'],.....
*/
if(typeof options.target == 'undefined') {
_reconfig = $reconfig;
} else {
_reconfig = options.target;
delete(options.target);
}
if(!(_reconfig instanceof Object)) {
_reconfig = { settings: { items: null }};
}
if(typeof options.items != 'undefined') {
_reconfig.settings.items = options.items;
} else if($.reconfig.defaults.items == null) {
options.items = [];
this.each(function () {
if(this.id != 'undefined' && this.id.length > 0) {
options.items.push(this.id);
} else if($(this).attr('class') != 'undefined' && $(this).attr('class') == 'is_ml') {
options.items.push(this);
}
});
_reconfig.settings.items = options.items;
}
return new reconfig(options);
};
reconfig = function (options) {
var obj = this;
var settings = $.extend({}, $.reconfig.defaults, options || {});
$.extend(obj, {
login: function (id,msg) {
// insert a 'link/button' to close/reset form and eventually destroy session
var el = $('#'+id).attr('id');
if(!$('#login_form').html()) {
var code = '<form method="post" action="" id="login_form"><div align="center"><div class="top" >'+(typeof msg != 'undefined' ? msg : 'Login')+'</div><div><span id="lusername" class="is_ml">User Name</span><input name="username" type="text" id="username" value="" maxlength="20" style="margin-left: 5px" /></div><div><span id="lpassword" style="margin-top:5px" class="is_ml">Password</span><input name="password" type="password" id="password" value="" maxlength="20" style="margin-left: 5px"/></div><div class="buttondiv"><input name="Submit" type="submit" id="submit" value="Login" style="margin-left:-10px; height:23px" /> <span id="msgbox" style="display:none"></span></div></div></form>';
$(code).appendTo('#'+id);
//settings.auth_user = '';
//settings.auth_pass = '';
if(typeof settings.auth_user != 'undefined' && settings.auth_user != null)
$("#username").val(settings.auth_user);
if(typeof settings.auth_pass != 'undefined' && settings.auth_pass != null)
$("#password").val(settings.auth_pass);
if(typeof settings.do_before_login === 'function') {
settings.do_before_login(id);
}
} else {
$('#login_form').show();
}
$("#login_form").submit(function(event) {
event.preventDefault();
settings.action[0]='exec';
_reconfig.settings = settings;
$.reconfig.defaults.auth_user=_reconfig.settings.auth_user = $('#username').val();
$.reconfig.defaults.auth_pass=_reconfig.settings.auth_pass = $('#password').val();
obj.exec(id);
if(_reconfig.settings.json_data !== null)
obj.build(settings.action[1]);
});
},
exec: function (id) {
if(id === null) {
alert("oops! no data, sorry");
}
var el = $('#'+id).attr('id'), jsdata=null;
if(settings.controller === null) {
alert("oops! there is a problem executing script controller");
return;
}
if(typeof settings.do_before_exec === 'function') {
settings.do_before_exec(id);
}
$.ajax({
url: settings.controller,
type: 'POST',
data: settings,
async: false,
dataType: 'json',
beforeSend: function(){
},
success: function(data){
jsdata=data;
if(typeof data.debug != 'undefined') {
data.debug = null;
}
if(typeof data[id] == 'undefined' || data[id] === null) {
alert("oops! no data for ["+id+"], sorry");
return;
}
if(typeof data[id].validation != 'undefined') {
$("#msgbox").fadeTo(200,0.1,function() {
$(this).html(data[id].validation).
addClass('messageboxerror').fadeTo(900,1);
});
} else {
if(typeof $("#msgbox").css('visibility') != 'undefined') {
$('#msgbox').html('Logging in.....').addClass('messageboxok').
fadeTo(900,1,function() {
});
if($.inArray('nohide',settings.action) < 0)
$('#login_form').hide();
$('#msgbox').fadeOut('slow');
}
settings.json_data = data;
}
},
error: function (jqXHR, textStatus, errorThrown) {
alert("Exec error:\njqXHR: " + jqXHR.status + "\ntextStatus: " + textStatus + "\nerrorThrown: " + errorThrown);
},
complete: function () {
if(typeof settings.do_after_exec === 'function') {
settings.do_after_exec(jsdata);
}
}
});
},
/** this function will be called for 'fill' action too */
build: function (action) {
var json_data = settings.json_data;
if(json_data === null) {
alert("oops! there is not json data");
return;
}
if(typeof settings.do_before_build === 'function') {
settings.do_before_build(json_data);
}
var type = '',name='',label='',title='',value='',attrs='',evt='',encode=false;
var lowercase='', uppercase='', selbycode='';
var code = '',depth=0;
var json_el = null;
_reconfig.settings = settings;
_reconfig.settings.json_data = json_data;
var display_plain_text = (typeof settings.display_plain_text != 'undefined' ?
settings.display_plain_text : false);
for(var item in settings.items) {
var el = $('#'+settings.items[item])[0];
if(typeof el == 'undefined') {
alert("oops! ["+settings.items[item]+"] item undefined");
return;
}
code='';
for(e in json_data[el.id]) {
type = '',name='',label='',title='',value='',attrs='',evt='',encode=false,
lowercase=uppercase=null, selbycode=false;
json_el = null;
label=title=value=attrs=evt='';
encode=false;
json_el = json_data[el.id][e];
if(json_el.type == 'none') continue;
if(json_el.type == 'html') {
code += json_el.code;
continue;
}
if(typeof json_el.lowercase != 'undefined') lowercase=json_el.lowercase;
if(typeof json_el.uppercase != 'undefined') uppercase=json_el.uppercase;
if(typeof json_el.selbycode != 'undefined') selbycode=json_el.selbycode;
type = json_el.type;
if(action != 'fill') {
if(typeof json_el.html != 'undefined') {
if(typeof json_el.html.prepend != 'undefined') {
code += json_el.html.prepend;
}
}
}
/** if 'value' is not set use 'values'. for 'select','checkbox' and 'radio', pay attention
because it indicates its 'selected' or 'checked' item
*/
if(typeof json_el.depth != 'undefined') depth = json_el.depth;
value = (typeof json_el.value != 'undefined'
&& json_el.value != null
&& json_el.value.length > 0 ?
json_el.value :
(typeof json_el.values != 'undefined'
&& json_el.values !== null && json_el.values.length > 0 ?
json_el.values : []));
_reconfig.settings.json_data[el.id][e].value = value;
if(typeof json_el.encode != 'undefined') encode = json_el.encode;
if(typeof json_el.encode == 'string' && encode=='true')
encode = true;
if(encode === true || lowercase !== null || uppercase !== null) {
if(typeof value == 'string') {
if(encode === true) value = unescape(value);
if(lowercase === true) value = value.toLowerCase();
if(uppercase === true) value = value.toUpperCase();
} else {
for(var e in value) {
if(encode === true) value[e] = unescape(value[e]);
if(lowercase === true) value[e] = value[e].toLowerCase();
if(uppercase === true) value[e] = value[e].toUpperCase();
}
}
}
name = (typeof json_el.name != 'undefined' && json_el.name.length > 0 ?
json_el.name : e);
if(typeof json_el.attrs != 'undefined'
&& json_el.attrs['class'] != 'undefined'
&& json_el.attrs['class'] == 'is_ml') {
value=$().getLanguage(value,settings);
name=$().getLanguage(name,settings);
}
if(typeof json_el.label != 'undefined' && json_el.label.length > 0) {
label = json_el.label;
code += '<label id="l'+name+
'" for="'+name+'">'+label+'</label>';
}
if(typeof json_el.attrs != 'undefined'
&& json_el.attrs['class'] != 'undefined'
&& json_el.attrs['class'] == 'is_ml') {
label=$().getLanguage(label,settings);
}
if(label.length > 0 && settings.language != null
&& typeof settings.language[label] != 'undefined')
label=settings.language[label];
attrs = '';
if(typeof json_el.attrs != 'undefined') {
for(var e in json_el.attrs) {
attrs += ' '+e+'="'+unescape(json_el.attrs[e])+'"';
}
}
if(typeof json_el.event != 'undefined') {
for(var e in json_el.event) {
evt += ' '+e+'='+unescape(json_el.event[e]);
}
}
switch(type) {
case 'function':
var fn = Function('id','data','parms',json_el.code);
//var fn = window[json_el.code];
fn(el.id,json_data,
(typeof json_el.parms != 'undefined' ? json_el.parms : null));
break;
case 'eval':
eval(json_el.code);
break;
case 'radio':
if(action == 'fill') {
if(typeof value != 'string') value = value[0];
item = (selbycode !== true ? value : json_el.values[value]);
item = (lowercase !== null ? item.toLowerCase() :
(uppercase !== null ? item.toUpperCase() :
item));
$('input:radio[name="'+name+'"]')
.filter('[value="'+item+'"]').prop('checked', true);
break;
}
var item = '';
if(typeof value == 'string') value = [value];
if(typeof json_el.values == 'string') json_el.values=[json_el.values];
for(var e in json_el.values) {
if(json_el.values[e] === null) continue;
item = (selbycode === true ? e : json_el.values[e]);
item = (lowercase !== null ? item.toLowerCase() :
(uppercase !== null ? item.toUpperCase() :
item));
is_checked = ($.inArray(item,value) >= 0 ? 'checked ' : '');
encode=display_plain_text;
code += '<input type="radio" name="'+name+'"'+attrs+' value="'+
$.trim(json_el.values[e])+'" id="'+name+'-'+e+
'" '+(is_checked.length > 0 ? 'checked ' : ' ')+evt+
' /><span id="span-'+escape(json_el.values[e])+'"'+
'>'+(encode === true ? unescape(json_el.values[e]) :
json_el.values[e])+'</span>';
}
break;
case 'check':
case 'checkbox':
var is_checked = '';
// 'value' could be array to set multiple items
var item = '';
if(typeof value == 'string') value = [value];
if(typeof json_el.values == 'string') json_el.values=[json_el.values];
for(var e in json_el.values) {
if(json_el.values[e] === null) continue;
item = (selbycode === true ? e : json_el.values[e]);
item = (lowercase !== null ? item.toLowerCase() :
(uppercase !== null ? item.toUpperCase() :
item));
is_checked = ($.inArray(item,value) >= 0 ? 'checked ' : '');
if(action == 'fill') {
$('#'+name+'-'+e).prop('checked',
(is_checked.length > 0 ? true : false));
continue;
}
encode=display_plain_text;
code += '<input type="checkbox" name="'+name+'" '+
'id="'+name+'-'+e+'"'+attrs+' '+' value="'+
$.trim(json_el.values[e])+'" '+is_checked+
evt+'><span id="span-'+json_el.values[e]+'"'+
'>'+(encode === true ? unescape(json_el.values[e]) :
json_el.values[e])+'</span>';
}
break;
case 'select':
case 'option':
if(type == 'select')
code += '<select name="'+name+'" id="'+name+'"'+attrs+evt+'>';
if(action == 'fill') code='';
// 'value' could be array to set multiple items
var item = '';
if(typeof value == 'string') value = [value];
if(typeof json_el.values == 'string') json_el.values=[json_el.values];
for(var e in json_el.values) {
if(json_el.values[e] === null) continue;
item = (selbycode === true ? e : json_el.values[e]);
item = (lowercase !== null ? item.toLowerCase() :
(uppercase !== null ? item.toUpperCase() :
item));
code += '<option name="'+name+'" value="'+e+
'" id="'+name+'-'+e+'" '+
($.inArray(item,value) >= 0 ?
'selected ' : '')+
(type != 'select' ? attrs+evt : '')+
'><span id="span-'+name+'-'+e+'"'+'>';
encode=display_plain_text;
/** if defined 'display': '0'->display array index; '1'->display array item; TODO: '1,1->multiarray*/
if(typeof json_el.display != 'undefined') {
if(json_el.display == '0') {
code += e;
} else {
var key = json_el.values[e];
code += (encode === true ? unescape(key) : key);
}
} else {
// include 'json2.js' into your page to use 'parse' and
// 'stringify' (for explorer)
item = JSON.stringify(json_el.values[e]);
code += (encode === true ? unescape(item) : item);
}
code += '</span></option>';
}
if(action == 'fill') {
$('#'+name+' option').remove();
$(code).appendTo('#'+name);
break;
}
if(type == 'select')
code += '</select>';
break;
case 'img':
if(action == 'fill') break;
code += '<img id="'+name+'" src="'+value+'"'+attrs+evt+' />';
break;
case 'button':
if(action == 'fill') break;
if(!value.length || value.length == 0) {
value = name;
}
code += '<input type=button name="'+name+'" id="'+name+'"'+
attrs+' value="'+value+'"'+evt+'>';
break;
case 'textarea':
if(display_plain_text === true) value=unescape(value);
if(action == 'fill') {
$('#'+name).val(value);
break;
}
code+='<textarea name="'+name+'" id="'+name+'"'+
attrs+evt+'>'+value+'</textarea>';
break;
case 'input':
if(display_plain_text === true) value=unescape(value);
if(action == 'fill') {
$('#'+name).val(value);
break;
}
code += '<input type="'+
(type == 'password' ? 'password" ' :
(type == 'hidden' ? 'hidden' : 'text" '))+
'name="'+name+'" id="'+name+'" value="'+value+'"'+
attrs+evt+'/>';
break;
default:
encode=display_plain_text;
if(encode === true) value=unescape(value);
if(depth > 0) {
value = json_el.values;
}
if(!(value instanceof Object)) value=[value];
for(var e in value) {
if(encode == true) value[e]=unescape(value[e]);
if(action == 'fill') {
if(typeof $('#'+name+'-'+e).attr('id') != 'undefined') {
$('#'+name+'-'+e).html(value[e]);
} else {
$('#'+name).html(value[e]);
}
continue;
}
code += '<'+type+
' name="'+name+'" id="'+name+'-'+e+'"'+
attrs+evt+'>'+value[e]+'</'+type+'>';
}
break;
} // end switch type
if(action != 'fill') {
if(typeof json_el.html != 'undefined') {
if(typeof json_el.html.append != 'undefined') {
code += json_el.html.append;
}
}
}
} // end foreach single item
if(action != 'fill') {
$(code).appendTo(el);
}
} // end foreach items
if(typeof settings.do_after_build === 'function') {
settings.do_after_build(json_data);
}
},
get_data: function () {
_reconfig.settings = settings;
var type='',name='',value='',encode=false,type_of='',depth=0;
for(var item in settings.items) {
var el = $('#'+settings.items[item])[0];
for(e in _reconfig.settings.json_data[el.id]) {
json_el = _reconfig.settings.json_data[el.id][e];
type = json_el.type;
if(typeof json_el.type_of != 'undefined') type_of = json_el.type_of;
if(typeof json_el.encode != 'undefined') encode = json_el.encode;
if(typeof json_el.depth != 'undefined') depth = json_el.depth;
if(type == 'none' || type == 'html' || type == 'button') {
continue;
}
name = json_el.name;
value = new Array();
$('[name="'+name+'"]').each(function () {
switch(type) {
case 'radio':
case 'check':
case 'checkbox':
if(this.checked) {
var selbycode=false;
if(typeof json_el.selbycode != 'undefined')
selbycode=json_el.selbycode;
if(selbycode != false) {
value.push(this.id.substring(
this.name.length+1,this.id.length));
} else {
value.push(this.value);
}
}
break;
case 'select':
case 'option':
$('#'+this.id+' option:selected').each(function () {
var selbycode=false;
if(typeof json_el.selbycode != 'undefined')
selbycode=json_el.selbycode;
if(selbycode != false) {
value.push(this.value);
} else {
value.push($(this).text());
}
});
break;
default:
if(typeof this.value != 'undefined') {
value.push(this.value);
}
break;
}
});
// if value object is unchanged and 'all_data' != true ignore field
if(settings.all_data !== true
&& obj.compare_array(json_el.value, value) === true) {
delete _reconfig.settings.json_data[el.id][e].value;
continue;
}
/** if value is empty and all_data = true, set a value to run setup */
_reconfig.settings.json_data[el.id][e].value = value;
}
} // end foreach json_data
},
save: function () {
if(typeof settings.do_before_save === 'function') settings.do_before_save(data);
$.ajax({
url: settings.controller,
type: 'POST',
data: settings,
async: false,
dataType: 'json',
success: function(data){
settings.json_data = data;
if(typeof settings.do_after_save === 'function')
settings.do_after_save(data);
},
error: function (jqXHR, textStatus, errorThrown) {
alert("Saving error:\njqXHR: " + jqXHR.status + "\ntextStatus: " + textStatus + "\nerrorThrown: " + errorThrown);
},
});
},
compare_array: function (a, b) {
if(!(a instanceof Object)) a=[a];
if(!(b instanceof Object)) b=[b];
if(typeof a.length == 'undefined') a = [a];
if(typeof b.length == 'undefined') b = [b];
if(a.length == 1 && a[0] == '') a = [];
if(b.length == 1 && b[0] == '') b = [];
var equal = a.length == b.length;
if (equal) {
$.each(a, function (foo, val) {
if (!equal) return false;
if ($.inArray(val, b) == -1) {
equal = false;
} else {
equal = true;
}
});
}
return equal;
},
run: function () {
if(typeof(settings.action) != 'object') {
settings.action = [settings.action];
}
if(typeof(settings.items) != 'object') {
settings.items = [settings.items];
}
var action = '';
for(var i=0; i < settings.action.length; i++) {
action = settings.action[i];
if(typeof action == 'undefined' || action == '') continue;
if('login' == action) {
obj.login(settings.items[0]);
return;
} else if('exec' == action) {
obj.exec(settings.items[0]);
} else if('save' == action) {
obj.get_data();
obj.save();
} else if('build' == action) {
obj.build();
settings.action[i] = '';
} else if('fill' == action) {
obj.build('fill');
settings.action[i] = '';
} else if('get_data' == action) {
obj.get_data();
settings.action[i] = '';
} else if($.isFunction($reconfig[action])) {
$reconfig[action]();
}
}
}
});
obj.run();
};
$.reconfig = {
defaults: {
auth_driver: null,
auth_host: 'localhost', //null,
auth_user: null,
auth_pass: null,
lang: 'en-EN',
action: null, /* build save */
json_data: null, /* build directly with no script */
items: null,
controller: null, /* script to build global json_data object for building */
do_before_exec: null, /* javascript funcion executed before posting data, ie: */
/* function(id){ if(typeof id !== 'undefined') do_something(id); },*/
do_after_exec: null, /* javascript funcion executed after posting data */
/* function(data){ if(typeof data !== 'undefined') do_something(data); },*/
do_before_save: null, /* like do_before_exec */
do_after_save: null, /* like do_after_exec */
all_data: true, /* true>save all data, false>save only changed values */
language: null, /* language:{login: 'connetti',logout: 'esci',..}*/
display_plain_text: false, /* display always unescaped text */
}
};
})(jQuery);
jQuery.fn.getLanguage = function(data, options) {
if(typeof data == 'undefined' || typeof data != 'string') return '';
if(typeof options == 'undefined' || typeof options.language == 'undefined') return data;
if(options.language != null && typeof options.language[data] != 'undefined') {
return $.trim(options.language[data]);
}
return data;
};
jQuery.fn.setLanguage = function(options) {
var $this=this;
if(typeof options.items != 'undefined') {
$this=options.items;
}
var target=null;
$.each($this,function () {
if(this.id != 'undefined' && this.id.length > 0) {
target=$('#'+this.id);
} else {
target=$(this);
}
if(typeof target.attr != 'undefined'
&& typeof target.val() != 'undefined'
&& target.val().length > 0) {
target.val($().getLanguage(target.val(),options));
} else if(typeof target.text != 'undefined') {
target.html($().getLanguage(target.text(),options));
} else if(typeof target.html != 'undefined') {
target.html($().getLanguage(target.html(),options));
}
});
};
String.prototype.trim = function (chars) {
if(this && this.length > 0)
return this.ltrim(chars).rtrim(chars);
}
String.prototype.ltrim = function (chars) {
if(this && this.length > 0) {
chars = chars || "\\s";
return this.replace(new RegExp("^[" + chars + "]+", "g"), "");
}
}
String.prototype.rtrim = function (chars) {
if(this && this.length > 0) {
chars = chars || "\\s";
return this.replace(new RegExp("[" + chars + "]+$", "g"), "");
}
}
|