You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
168 lines
6.5 KiB
168 lines
6.5 KiB
/*
|
|
* File: jquery.loadJSON.js
|
|
* Version: 1.0.0.
|
|
* Author: Jovan Popovic
|
|
*
|
|
* Copyright 2011 Jovan Popovic, all rights reserved.
|
|
*
|
|
* This source file is free software, under either the GPL v2 license or a
|
|
* BSD style license, as supplied with this software.
|
|
*
|
|
* This source file is distributed in the hope that it will be useful, but
|
|
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
|
* or FITNESS FOR A PARTICULAR PURPOSE.
|
|
*
|
|
* This file contains implementation of the JQuery templating engine that load JSON
|
|
* objects into the HTML code. It is based on Alexandre Caprais notemplate plugin
|
|
* with several enchancements that are added to this plugin.
|
|
*/
|
|
|
|
(function ($) {
|
|
$.fn.loadJSON = function (obj, options) {
|
|
|
|
function setElementValue(element, value, name) {
|
|
var type = element.type || element.tagName;
|
|
if (type == null)
|
|
return;
|
|
type = type.toLowerCase();
|
|
switch (type) {
|
|
|
|
case 'radio':
|
|
if (value.toString().toLowerCase() == element.value.toLowerCase())
|
|
$(element).attr("checked", "checked");
|
|
break;
|
|
|
|
case 'checkbox':
|
|
if (value)
|
|
$(element).attr("checked", "checked");
|
|
break;
|
|
|
|
case 'select-multiple':
|
|
var values = value.constructor == Array ? value : [value];
|
|
for (var i = 0; i < element.options.length; i++) {
|
|
for (var j = 0; j < values.length; j++) {
|
|
element.options[i].selected |= element.options[i].value == values[j];
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 'select':
|
|
case 'select-one':
|
|
case 'text':
|
|
case 'hidden':
|
|
$(element).attr("value", value);
|
|
break;
|
|
case 'a':
|
|
var href = $(element).attr("href");
|
|
var iPosition = href.indexOf('?');
|
|
if (iPosition > 0) // if parameters in the URL exists add new pair using &
|
|
href = href.substring(0, iPosition) + '?' + name + '=' + value;
|
|
else//otherwise attach pair to URL
|
|
href = href + '?' + name + '=' + value;
|
|
$(element).attr("href", href);
|
|
break;
|
|
case 'img': //Assumption is that value is in the HREF$ALT format
|
|
var iPosition = value.indexOf('$');
|
|
var src = "";
|
|
var alt = "";
|
|
if (iPosition > 0) {
|
|
src = value.substring(0, iPosition);
|
|
alt = value.substring(iPosition + 1);
|
|
}
|
|
else {
|
|
src = value;
|
|
var iPositionStart = value.lastIndexOf('/')+1;
|
|
var iPositionEnd = value.indexOf('.');
|
|
alt = value.substring(iPositionStart, iPositionEnd);
|
|
}
|
|
$(element).attr("src", src);
|
|
$(element).attr("alt", alt);
|
|
break;
|
|
|
|
case 'textarea':
|
|
case 'submit':
|
|
case 'button':
|
|
default:
|
|
try {
|
|
$(element).html(value);
|
|
} catch (exc) { }
|
|
}
|
|
|
|
}
|
|
|
|
function browseJSON(obj, element, name) {
|
|
|
|
// no object
|
|
if (obj == undefined) {
|
|
}
|
|
// branch
|
|
else if (obj.constructor == Object) {
|
|
for (var prop in obj) {
|
|
if (prop == null)
|
|
continue;
|
|
//Find an element with class, id, name, or rel attribute that matches the propertu name
|
|
var child = jQuery.makeArray(jQuery("." + prop, element)).length > 0 ? jQuery("." + prop, element) :
|
|
jQuery("#" + prop, element).length > 0 ? jQuery("#" + prop, element) :
|
|
jQuery('[name="' + prop + '"]', element).length > 0 ? jQuery('[name="' + prop + '"]', element) : jQuery('[rel="' + prop + '"]');
|
|
if (child.length != 0)
|
|
browseJSON(obj[prop], jQuery(child, element), prop);
|
|
}
|
|
}
|
|
// array
|
|
else if (obj.constructor == Array) {
|
|
if (element.length > 0 && element[0].tagName == "SELECT") {
|
|
setElementValue(element[0], obj, name);
|
|
} else {
|
|
var arr = jQuery.makeArray(element);
|
|
//how many duplicate
|
|
var nbToCreate = obj.length - arr.length;
|
|
var i = 0;
|
|
for (iExist = 0; iExist < arr.length; iExist++) {
|
|
if (i < obj.length) {
|
|
$(element).eq(iExist).loadJSON(obj[i]);
|
|
}
|
|
i++;
|
|
}
|
|
//fill started by last
|
|
i = obj.length - 1;
|
|
for (iCreate = 0; iCreate < nbToCreate; iCreate++) {
|
|
//duplicate the last
|
|
$(arr[arr.length - 1]).clone(true).insertAfter(arr[arr.length - 1]).loadJSON(obj[i]);
|
|
i--;
|
|
}
|
|
}
|
|
}
|
|
// data only
|
|
else {
|
|
var value = obj;
|
|
var type;
|
|
if (element.length > 0) {
|
|
for (i = 0; i < element.length; i++)
|
|
setElementValue(element[i], obj, name);
|
|
}
|
|
else {
|
|
setElementValue(element, obj, name);
|
|
}
|
|
}
|
|
} //function browseJSON end
|
|
|
|
var defaults = {
|
|
};
|
|
|
|
properties = $.extend(defaults, options);
|
|
|
|
return this.each(function () {
|
|
|
|
if (obj.constructor == String) {
|
|
var element = $(this);
|
|
$.get(obj, function (data) {
|
|
element.loadJSON(data);
|
|
});
|
|
}
|
|
|
|
else {
|
|
browseJSON(obj, this);
|
|
}
|
|
});
|
|
};
|
|
})(jQuery); |