%PDF- %PDF-
| Direktori : /home/gachan/www/wp-content/plugins/jekas_extensions/meta-box/js/ |
| Current File : /home/gachan/www/wp-content/plugins/jekas_extensions/meta-box/js/rc_general.js |
var rc,rcData ={};
( function($) {
rc = {
buildForm: function (tag) {
if (this[tag] && this.currentCol) {
var obj = this[tag];
var id = this.currentCol;
var $form = $('<div>').addClass('rc-form rc-form-'+tag).attr({"data-col" : id, "data-tag" : tag}) ;
if (rcData[id].attr) {
$.each(rcData[id].attr, function (k, v) {
if (obj.fields && obj.fields[k]) {
var fieldType = obj.fields[k].type;
obj.fields[k].name = k;
var $field = rc.buildField(fieldType, obj.fields[k], v);
if ($field)
$field.appendTo($form);
}
});
}
else {
$.each(obj.fields, function (k, v) {
v.name = k;
rc.buildField(v.type, v).appendTo($form);
});
}
var $title = this[tag].title;
var $buttons = {};
$buttons[rc_l10n.save] = function () {
var key = $(this).data('col');
$(this).find('input.rc-field,select.rc-field,textarea.rc-field').each(function () {
var tree = $(this).attr('name').split('.');
var $name = $(this).attr('name');
var $value = $(this).val();
var $attr = {};
if(!rcData[key].attr)
rcData[key].attr = {};
if(tree.length == 1) {
rcData[key].attr[$name] = $(this).val();
return;
}
var $expression = 'rcData[key].attr';
var $part = tree.shift();
function getExpression(exp,add){
return (/^0|([1-9][0-9]*)$/.test(add)) ? exp+'['+add+']' : exp+'.'+add;
}
function evalCreateObject(exp,add){
var $temp = exp;
$temp += '=';
$temp += (/^0|([1-9][0-9]*)$/.test(add)) ? '[]' : '{}';
eval($temp);
}
function evalAssigValue(exp,add){
exp += ' = "'+ add+ '"';
eval(exp);
}
function evalExists(exp){
return eval(exp + '!== undefined ');
}
try {
while (tree.length > 1 && evalExists(getExpression($expression, $part))) {
$expression = getExpression($expression, $part);
$part = tree.shift();
}
$expression = getExpression($expression, $part);
var $temp;
if (tree.length == 1) {
$part = tree[0];
if(!evalExists($expression))
evalCreateObject($expression,$part);
$expression = getExpression($expression, $part);
evalAssigValue($expression,$(this).val());
return;
}
while (tree.length > 1) {
$part = tree.shift();
evalCreateObject($expression,$part);
$expression = getExpression($expression, $part);
}
$part = tree[0];
evalCreateObject($expression, $part);
$expression = getExpression($expression, $part);
evalAssigValue($expression,$(this).val());
}
catch($error ){
$error+= '\n';
$error+= rc_l10n.expression+' :'+getExpression($expression,$part);
alert($error);
}
});
rcData[key].tag =$(this).data('tag');
rc.updateContent(rcData[key].input);
$('#'+key).html('').append(rc.buildTagCol(rcData[key].tag));
$(this).dialog('destroy');
};
$buttons[rc_l10n.cancel] = function () {
$(this).dialog('destroy');
};
$form.dialog({
autoOpen: true,
modal: true,
width: 300,
resizable: false,
title: $title,
buttons: $buttons,
close: function () {
$(this).dialog('destroy')
},
destroy:function(){
$(this).remove();
},
closeText: '×',
create: function(event,ui){
$(this).parents('.ui-dialog:first').addClass('rc-form-dialog');
}
});
}
},
buildField: function (type, settings, value) {
switch (type) {
case 'text' :
return this._buildTextField(settings, value);
case 'textarea' :
return this._buildTextArea(settings, value);
case 'select' :
return this._buildSelect(settings, value);
case 'button_set' :
return this._buildButtonSet(settings, value);
case 'color' :
return this._buildColor(settings, value);
case 'datetime' :
return this._buildDateTime(settings, value);
case 'accordion' :
return this._buildAccordion(settings, value);
case 'image' :
return this._buildImage(settings, value);
}
return false;
},
_buildTextField: function (settings, value) {
var $field = $('<div class = "rc-field-container">');
if (settings.title)
$('<label>').html(settings.title).appendTo($field);
if (!settings.multiple) {
$('<input type = "text" class="rc-field"/>').attr('name', settings.name).appendTo($field);
if (value !== undefined)
$field.find('input:text').val(value);
else if (settings.defaultValue)
$field.find('input:text').val(settings.defaultValue);
return $field;
}
$('<div class="textFieldsContainer"> <div class ="listTextFields"></div> </div>').appendTo($field);
var isFixed = false;
if (settings.fixed) {
var fixed = parseInt(settings.fixed);
isFixed = isNaN(fixed);
}
if (!isFixed) {
var $buttonAdd = $('<button class ="addField"><i class="fa fa-plus"></i>'+rc_l10n.add_field+'</button>').click(addTextField);
$field.find('.texttextFieldsContainer').append($buttonAdd);
}
if (settings.limit)
$field.find('.texttextFieldsContainer').attr('data-limit', settings.limit);
var iterateValue = function (k, v) {
var $layerField = $('<div class="textField"><input type = "text" name = "' + settings.name + '.' + k + '" value = "' + v + '" /></div>');
if (!isFixed)
$('<button class="removeField"> <i class="fa fa-trash"></i>'+rc_l10n.delete_field+'</button>')
.click(removeTextField).appendTo($layerField);
};
if ($.isArray(value)) {
$.each(value, iterateValue);
return $field;
}
if ($.isArray(settings.defaultValue)) {
$.each(settings.defaultValue, iterateValue);
return $field;
}
var length = (isFixed) ? settings.fixed : 1;
for (var i = 0; i < length; i++) {
var $layerField = $('<div class="textField"><input type = "text" name = "' + settings.name + '" /></div>');
if (!isFixed)
$('<button class="removeField"> <i class="fa fa-trash"></i>'+rc_l10n.delete_field+'</button>')
.click(removeTextField).appendTo($layerField);
}
},
_buildTextArea: function (settings, value) {
var $field = $('<div class = "rc-field-container">');
if (settings.title)
$('<label>').html(settings.title).appendTo($field);
if (!settings.multiple) {
$('<textarea class="rc-field">').attr('name', settings.name).appendTo($field);
if (value !== undefined)
$field.find('textarea').val(value);
else if (settings.defaultValue)
$field.find('textarea').val(settings.defaultValue);
return $field;
}
$('<div class="textAreasContainer"> <div class ="listTextArea"></div> </div>').appendTo($field);
var isFixed = false;
if (settings.fixed) {
var fixed = parseInt(settings.fixed);
isFixed = isNaN(fixed);
}
if (!isFixed) {
var $buttonAdd = $('<button class ="addField"><i class="fa fa-plus"></i> '+rc_l10n.add_field+'</button>').click(addTextArea);
$field.find('.textAreasContainer').append($buttonAdd);
}
if (settings.limit)
$field.find('.textAreasContainer').attr('data-limit', settings.limit);
var iterateValue = function (k, v) {
var $layerField = $('<div class="textArea"> <textarea name="' + settings.name + '.' + k + '" >' + v + '</textarea> </div>');
if (!isFixed)
$('<button class="removeField"> <i class="fa fa-trash"></i> '+rc_l10n.delete_field+' </button>')
.click(removeTextArea).appendTo($layerField);
};
if ($.isArray(value)) {
$.each(value, iterateValue);
return $field;
}
if ($.isArray(settings.defaultValue)) {
$.each(settings.defaultValue, iterateValue);
return $field;
}
var length = (isFixed) ? settings.fixed : 1;
for (var i = 0; i < length; i++) {
var $layerField = $('<div class="textArea"> <textarea name="' + settings.name + '"></textarea> </div>');
if (!isFixed)
$('<button class="removeField"> <i class="fa fa-trash"></i> '+rc_l10n.delete_field+'</button>')
.click(removeTextArea).appendTo($layerField);
}
},
_buildSelect: function (settings, value) {
if ( typeof(settings.options)!= 'object' && !$.isArray(settings.options) && !settings.loadIcons)
return false;
var $field = $('<div class = "rc-field-container rc-field-container-select">');
if (settings.title)
$('<label>').html(settings.title).appendTo($field);
var $selectField = $('<select name = "' + settings.name + '" class = "rc-field" ></select>');
if(settings.multiple)
$selectField.attr('multiple','multiple');
var selectedOption;
if (value !== undefined) {
if ($.isArray(value))
selectedOption = value;
else
selectedOption = [value];
}
else if (settings.defaultValue) {
if ($.isArray(settings.defaultValue))
selectedOption = settings.defaultValue;
else
selectedOption = [settings.defaultValue];
}
if (settings.loadIcons)
settings.options = rcmb.icons;
$.each(settings.options, function (k, v) {
var $option = $('<option>').val(settings.loadIcons ? v : k);
if(selectedOption === undefined)
selectedOption = [v];
if($.inArray((settings.loadIcons) ? v : k,selectedOption )!= -1 )
$option.attr('selected','selected');
$option.html(v).appendTo($selectField);
});
$selectField.appendTo($field);
var selectSettings = {};
if (settings.loadIcons) {
function rcAddIcon(icon) {
if (icon.text != false)
return "<span ><i class='" + icon.text + "'></i>" + " " + icon.text + "</span>";
return '<span><i></i>-None-</span>';
}
$.extend(selectSettings, {
formatResult: rcAddIcon,
formatSelection: rcAddIcon,
escapeMarkup: function (m) {
return m;
}
});
}
$selectField.select2(selectSettings);
return $field;
},
_buildButtonSet: function (settings, value) {
if (typeof (settings.options) != 'object' && !$.isArray(settings.options))
return false;
var $field = $('<div class = "rc-field-container">');
if (settings.title)
$('<label>').html(settings.title).appendTo($field);
var $btnGroup = $(' <div class ="rwmb-button-group"></div>');
var selectedOption;
if (value !== undefined) {
if ($.isArray(value))
selectedOption = value;
else
selectedOption = [value];
}
else if (settings.defaultValue) {
if ($.isArray(settings.defaultValue))
selectedOption = settings.defaultValue;
else
selectedOption = [settings.defaultValue];
}
else
selectedOption = [];
$.each(settings.options, function (k, v) {
var idOption = rcmb.helpers.uniqid();
$('<label>').attr('for', idOption).html(v).appendTo($btnGroup);
$('<input class="rc-field">').val(k)
.attr({
type: (settings.multiple) ? 'checkbox' : 'radio',
name: settings.name,
'checked': $.inArray(selectedOption, k),
id: idOption
})
.appendTo($btnGroup);
});
$btnGroup.appendTo($field);
$btnGroup.buttonset();
return $field;
},
_buildColor: function (settings, value) {
var $field = $('<div class = "rc-field-container">');
if (settings.title)
$('<label>').html(settings.title).appendTo($field);
var $colorInput = $('<input type="text" class="rc-field" />').attr('name', settings.name);
if (value !== undefined)
$colorInput.val(value);
else if (settings.defaultValue)
$colorInput.val(settings.defaultValue);
if (!settings.options)
settings.options = {};
$.extend(settings.options,
{
showInput: true,
showAlpha:true,
allowEmpty:true,
preferredFormat:'hex6',
change: function(color){
$(this).val(color);
}
});
$colorInput.appendTo($field);
$colorInput.spectrum(settings.options);
return $field;
},
_buildDateTime: function (settings, value) {
var $field = $('<div class = "rc-field-container">');
if (settings.title)
$('<label>').html(settings.title).appendTo($field);
var $input = $('<input type="text" class = "rc-field"/>').attr('name', settings.name);
if (value !== undefined)
$input.val(value);
else if (!settings.defaultValue)
$input.val(settings.defaultValue);
$input.appendTo($field);
if (!settings.options)
settings.options = {};
if (settings.part)
switch (settings.part) {
case 'onlyTime' :
$input.timepicker(settings.options);
break;
case 'onlyDate' :
$input.datepicker(settings.options);
break;
default :
$input.datetimepicker(settings.options);
}
else
$input.datetimepicker(settings.options);
return $field;
},
_buildAccordion: function (settings, value) {
if (!settings.subfields)
return false;
var $field = $('<div class = "rc-field-container ">');
if (settings.title)
$('<label>').html(settings.title).appendTo($field);
var $title = settings.title;
if($title.lastIndexOf('s') == $title.length -1 )
$title = $title.substring(0,$title.lastIndexOf('s'));
$('<div class = "rc-accordion-container"> <div class="rc-accordion"></div></div>').appendTo($field)
var $accordion = $field.find('div.rc-accordion');
$('<button class ="rc-button"> <i class="fa fa-plus"></i>'+ rc_l10n.add+ ' ' +settings.title+' </button>').attr('data-name',settings.name).click(rcAddSection).appendTo($field);
var sectionValues;
if ($.isArray(value))
sectionValues = value;
else if ($.isArray(settings.defaultValue))
sectionValues = settings.defaultValue;
else
sectionValues = [];
if (sectionValues.length == 0) {
var $section = false;
$.each(settings.subfields, function (k, v) {
if (v.type != 'accordion') {
v.name = settings.name + '.0.' + k;
var $subfield = rc.buildField(v.type, v);
if ($subfield) {
if (!$section)
$section = $('<div class="rc-accordion-section"></div>');
$subfield.appendTo($section);
}
}
});
if (!$section) return false;
$('<button class ="rc-button"> <i class="fa fa-trash"></i> '+rc_l10n.delete+' </button>').attr('data-name',settings.name).click(rcRemoveSection).appendTo($section);
$accordion.append('<h3> '+$title+' 1 </h3>');
$section.appendTo($accordion);
$accordion.accordion(this.accordionSettings);
return $field;
}
var found = false;
var $subfields = settings.subfields;
$.each(sectionValues, function (key, val) {
if (typeof(val) == 'object') {
$section = false;
$.each(val, function (k, v) {
if ($subfields[k].type != 'accordion') {
$subfields[k].name = settings.name + '.' + key + '.' + k;
var $subfield = rc.buildField($subfields[k].type,$subfields[k] ,v);
if ($subfield) {
found = true;
if (!$section)
$section = $('<div class="rc-accordion-section"></div>');
$subfield.appendTo($section);
}
}
});
if ($section) {
var sectionNumber = parseInt(key) + 1;
$('<button class ="rc-button"> <i class="fa fa-trash"></i> '+rc_l10n.delete_field+' </button>').attr('data-name',settings.name).click(rcRemoveSection).appendTo($section);
$accordion.append('<h3> '+ $title + ' ' + sectionNumber.toString() + ' </h3>');
$section.appendTo($accordion);
}
}
});
if (!found) return false;
$accordion.accordion(this.accordionSettings);
return $field;
},
_buildImage: function (settings, value) {
var $field = $('<div class="rc-field-container"><ul class="rc-image-container" ></ul></div> ');
var $gallery = $field.find('ul.rc-image-container').attr('data-name', settings.name);
$gallery.addClass(settings.gallery ? 'rc-gallery' : 'rc-single');
if (settings.title)
$('<label>').html(settings.title).prependTo($field);
var selectedOption;
if (value !== undefined) {
if ($.isArray(value))
selectedOption = value;
else
selectedOption = [value];
}
else if (settings.defaultValue) {
if ($.isArray(settings.defaultValue))
selectedOption = settings.defaultValue;
else
selectedOption = [settings.defaultValue];
}
else
selectedOption = [];
$(selectedOption, function (k, v) {
var $img = $('<li class="rc-added"><div class = "rc-image"> <img src="' + v + '" alt=""/> </div> <i class="fa fa-times"></i> </li>');
$img.find('i').click(removeImage);
$('<input type = "hidden" class="rc-field">').attr('name', (settings.gallery) ? settings.name + '.' + k : settings.name).val(v).appendTo($img);
$img.appendTo($gallery);
});
$btnAdd = $('<li class = "rc-add-image"> <i class="fa fa-plus"></i> </li>').click(addImage).appendTo($gallery);
return $field;
},
updateContent: function (rowContainer) {
var $content = $('<div>');
var $input = $('#' + rowContainer);
var $colCount = $input.parent().find('select.col-counter').val();
$colCount = parseInt($colCount);
var $lastChild = $input.parent().find('.rcmb-row >div').size() - $colCount + 1;
$input.parent().find('.rcmb-row > div:nth-last-child(n+' + $lastChild + ' )').each(function () {
var $column = $('<div>');
$(this).find('.grid-form select').each(function () {
if ($(this).val() != 0) {
var $mesure = 'col-' + $(this).attr('name') + '-' + $(this).val();
$column.addClass($mesure);
}
});
var $idEl = $(this).find('.content-shortcode').attr('id');
if ($idEl !== undefined && rcData[$idEl] && rcData[$idEl].tag) {
function hasComposedData($v){
if($.isArray($v))
for( var i = 0; i<$v.length ; i++)
if($.isArray($v[i]) || typeof($v) == 'object')
return true;
if(typeof($v) == 'object' )
for(var i in $v)
if($.isArray($v[i]) || typeof($v) == 'object')
return true;
return false;
}
var $parameters = '';
var $parameterCompose = {};
var $compCount = 0;
$.each(rcData[$idEl].attr, function (k, v) {
if ($.isArray(v) || typeof(v) == 'object'){
if(!hasComposedData(v)){
$parameters += k + " = '";
var parameterValue = '';
$.each(v,function(key,val){
if(parameterValue != '')
parameterValue+='|';
parameterValue += $.param({v:key}).substring(2)+'=>'+$.param({v:val}).substring(2);
});
$parameters+=parameterValue+"' ";
}
else {
$parameterCompose[k] = v;
$compCount ++;
}
}
else {
$parameters += k + " = '";
$parameters += $.param({x: v}).substring(2) + "' ";
}
});
if(rcData[$idEl].tag) {
if($compCount == 0)
$column.html('[' + rcData[$idEl].tag + ' ' + $parameters + '/]');
else
{
var $shortcode = '[' + rcData[$idEl].tag + ' ' + $parameters + ']';
var $tag = rcData[$idEl].tag;
$.each($parameterCompose,function(k,v){
var $tagChild = rc[$tag].fields[k].tag;
$.each(v,function(key,val){
var $parameters= '';
$.each(val,function(i,j){
$parameters += i + "= '" + j+ "' ";
});
$shortcode+= "[rc_parameter tag ='" + $tagChild + "' parameter_name = '"+k+"' " +$parameters+ '/]';
});
});
$shortcode+= '[/'+ rcData[$idEl].tag+']';
$column.html($shortcode);
}
}
}
$column.appendTo($content);
});
var $contentHml = $content.html();
$input.val($contentHml);
},
buildTagCol : function(tag){
var $containerTag = $('<div class = "rc-container-tag"></div>');
var $img_icon = $('#rcmb-shortcodes-toolbar > ul > li[data-tag='+tag+']').find('img,i').clone();
$img_icon.toggleClass('fa-2x fa-3x').appendTo($containerTag);
var $colActions = $('<div class = "rc-col-actions"></div>');
$('<i class="fa fa-pencil fa-2x" data-tag = "'+tag+'" title="Edit this '+rc[tag].title+'"></i>').click(editTag).appendTo($colActions);
$('<i class="fa fa-trash fa-2x" title = "Delete this '+rc[tag].title+'"></i>').click(removeTag).appendTo($colActions);
$colActions.appendTo($containerTag);
return $containerTag;
},
accordionSettings :{
heightStyle:'content',
icons:{header:"fa fa-caret-right", activeHeader : 'fa fa-caret-down'}
}
};
// Events Functions
function addTextField() {
var $list = $(this).parent().find('.listTextFields');
var $layerField = $('<div class="textField"> <input type="text" /> <button class="removeField"> <i class="fa fa-trash"></i> '+rc_l10n.delete_field+' </button> </div>');
$layerField.find('button').click(removeTextField);
$layerField.appendTo($list);
var limit = parseInt($(this).parent().data('limit'));
if (!isNaN(limit) && limit == $list.find('.textField').size())
$(this).hide();
}
function addTextArea() {
var $list = $(this).parent().find('.listTextAreas');
var $layerField = $('<div class="textArea"> <input type="text" /> <button class="removeField"> <i class="fa fa-trash"></i> '+rc_l10n.delete_field+' </button> </div>');
$layerField.find('button').click(removeTextArea);
$layerField.appendTo($list);
var limit = parseInt($(this).parent().data('limit'));
if (!isNaN(limit) && limit == $list.find('.textArea').size())
$(this).hide();
}
function removeTextField() {
$(this).parents('.textFieldsContainer').find('button.addField').show();
$(this).parent().remove();
}
function removeTextArea() {
$(this).parents('.textAreasContainer').find('button.addField').show();
$(this).parent().remove();
}
function addImage() {
var $isGallery = ($(this).parent().data('gallery') == 1);
var $name = $(this).parent().data('name');
var frame = wp.media({
title: ($isGallery) ? 'Add Image' : 'Set Image',
filterable: 'uploaded',
library: wp.media.query({type: 'image'}),
editable: $isGallery,
multiple: $isGallery,
button: {
text: 'Use this media'
}
});
var obj = this;
frame.on('select', function () {
// Get media attachment details from the frame state
frame.state().get('selection').each(function (i) {
var attachment = $(this).toJSON();
var imageItem = $('<li class="rc-image"> <img src="' + attachment.url + '" alt=""/> <button class="removeField"> <i class="fa fa-trash"></i> Delete Field </button></li>');
$('<input type = "hidden">').attr('name', ($isGallery) ? $name + '.' + i : $name).val(attachment.url).appendTo(imageItem);
imageItem.find('button.removeField').click(removeImage);
imageItem.insertBefore(obj);
});
});
frame.open();
}
function removeImage() {
$(this).parent().remove();
}
function rcAddSection() {
var $accordion = $(this).parent().find('.rc-accordion').accordion('destroy');
var $tag = $(this).parents('.rc-form:first').data('tag');
var $name = $(this).data('name');
var $subfields = rc[$tag].fields[$name].subfields;
var $title = rc[$tag].fields[$name].title;
if($title.lastIndexOf('s') == $title.length -1 )
$title = $title.substring(0,$title.lastIndexOf('s'));
var numberSection = $accordion.find('.rc-accordion-section').size();
var $newSection = false;
var $accordionSettings = rc.accordionSettings;
$accordionSettings.active = numberSection;
$.each($subfields, function (k, v) {
if (v.type != 'accordion') {
v.name = $name+'.'+numberSection+'.'+ k;
var $subfield = rc.buildField(v.type, v);
if ($subfield) {
if (!$newSection)
$newSection = $('<div class="rc-accordion-section"></div>');
$subfield.appendTo($newSection);
}
}
});
if ($newSection) {
$('<button class ="rc-button"> <i class="fa fa-trash"></i> Delete </button>').attr('data-name',$name).click(rcRemoveSection).appendTo($newSection);
numberSection++;
$accordion.append('<h3> '+$title+ ' ' + numberSection.toString() + ' </h3>');
$newSection.appendTo($accordion);
}
$accordion.accordion($accordionSettings);
$accordionSettings.active = 0;
}
function rcRemoveSection(){
var $accordion = $(this).parents('.rc-accordion').accordion('destroy');
rc.accordionSettings.active = $(this).parent().prevAll('.rc-accordion-section').size();
var $iterator = rc.accordionSettings.active;
var $tag = $(this).parents('.rc-form:first').data('tag');
var $name = $(this).data('name');
var $title = rc[$tag].fields[$name].title;
if($title.lastIndexOf('s') == $title.length -1 )
$title = $title.substring(0,$title.lastIndexOf('s'));
var $nextSections = $(this).parent().nextAll('.rc-accordion-section');
$(this).parent().prev().remove();
$(this).parent().remove();
var $temp = $iterator;
$nextSections.each(function(){
$(this).find('input.rc-field,.select.rc-field,textarea.rc-field').each(function(){
var myName = $(this).attr('name').split('.');
myName[1] = $iterator;
$(this).attr('name',myName.join('.'));
});
$iterator ++;
$(this).prev().html($title+' '+ $iterator.toString());
});
if($iterator == $temp)
rc.accordionSettings.active --;
$accordion.accordion(rc.accordionSettings);
rc.accordionSettings.active = 0;
}
function editTag(){
rc.currentCol = $(this).parents('.content-shortcode').attr('id');
var $tag = $(this).data('tag');
rc.buildForm($tag);
}
function removeTag(){
var colToRemove = $(this).parents('.content-shortcode').attr('id');
var $input = rcData[colToRemove].input;
delete rcData[colToRemove];
rcData[colToRemove] = {input: $input};
$(this).parents('.content-shortcode').html('').append('<i class = "fa fa-plus fa-2x add-tag"></i> ');
rc.updateContent($input);
}
$(document).ready(function(){
$('.rcmb-row .rc-col-actions i').each(function(){
var fn = ($(this).data('op') == 'edit') ? editTag : removeTag;
$(this).click(fn);
});
});
})(jQuery);