/* jQuery json2form Plugin
* version: 1.0 (2011-03-01)
*
* Copyright (c) 2011, Crystal, shimingxy@163.com
* Dual licensed under the MIT and GPL licenses:
* http://www.opensource.org/licenses/mit-license.php
* http://www.gnu.org/licenses/gpl.html
* Date: 2011-03-01 rev 1
*/
;(function ($) {
$.json2form = $.json2form||{};
$.fn.json2form = function(config ) {
var config=$.extend({
url :null,
elem :this.attr("id"),
type :'POST'
}, config || {});
if(config.url){
$.ajax({type: config.type,url: config.url,data:$.extend({json2form:config.elem},config.data||{}),dataType: "json",async: false,
success: function(data){
config.data=data;
}
});
}
if(!$("#"+config.elem).attr("loadedInit")){//init checkbox radio and select element ,label
if(config.data.init){
for (var elem in config.data.init){
var arrayData=config.data.init[elem];
if($("#"+config.elem+" input[name='"+elem+"']")){
var elemType=$("#"+config.elem+" input[name='"+elem+"']").attr("type");
var elemName=$("#"+config.elem+" input[name='"+elem+"']").attr("name");
var initElem=$("#"+config.elem+" input[name='"+elem+"']");
switch(elemType){
case "checkbox":
case "radio":
for (var initelem in arrayData){
initElem.after(''+arrayData[initelem].display);
}
initElem.remove();
break;
}
}
if($("#"+config.elem+" select[name='"+elem+"']")){
for (var initelem in arrayData){
$("#"+config.elem+" select[name='"+elem+"']").append("");
}
}
}
}
if(config.data.label){//label
$("#"+config.elem+" label").each(function(){
var labelFor=$(this).attr("for");
if(config.data.label[labelFor]){
$(this).html(config.data.label[labelFor]);
}
});
}
}
if(config.data){//input text password hidden button reset submit checkbox radio select textarea
$("#"+config.elem+" input,select,textarea").each(function(){
var elemType=$(this).attr("type")==undefined?this.type:$(this).attr("type");
var elemName=$(this).attr("name");
var elemData=config.data[elemName];
if(!$("#"+config.elem).attr("loadedInit")&&$(this).attr("loadurl")){
switch(elemType){
case "checkbox":
case "radio":
case "select":
case "select-one":
case "select-multiple":{
var _this =this;
$.ajax({type: config.type,url: $(this).attr("loadurl"),dataType: "json",async: false,success: function(data){
if(elemType=="select"||elemType=="select-one"||elemType=="select-multiple"){
$(_this).empty();
}
for (var elem in data){
if(elemType=="select"||elemType=="select-one"||elemType=="select-multiple"){
$(_this).append("");
}else{
$(_this).after(''+data[elem].display);
}
}
if(elemType=="checkbox"||elemType=="radio")$(_this).remove();
}
});
break;
}
}
}
if(elemData){
switch(elemType){
case undefined:
case "text":
case "password":
case "hidden":
case "button":
case "reset":
case "textarea":
case "submit":{
if(typeof(elemData)=="string"){
$(this).val(elemData.toUpperCase()=="NULL"?"":elemData);
}else{
$(this).val(elemData+"");
}
break;
}
case "checkbox":
case "radio":{
$(this).attr("checked",false);
if(elemData.constructor==Array){//checkbox multiple value is Array
for (var elem in elemData){
if(elemData[elem]==$(this).val()){
$(this).attr("checked",true);
}
}
}else{//radio or checkbox is a string single value
if(elemData==$(this).val()){
$(this).attr("checked",true);
}
}
break;
}
case "select":
case "select-one":
case "select-multiple":{
$(this).find("option:selected").attr("selected",false);
if(elemData.constructor==Array){
for (var elem in elemData){
$(this).find("option[value='"+elemData[elem]+"']").attr("selected",true);
}
}else{
$(this).find("option[value='"+elemData+"']").attr("selected",true);
}
break;
}
}
}
});
}
$("#"+config.elem).attr("loadedInit","true");//loadedInit is true,next invoke not need init checkbox radio and select element ,label
};
})(jQuery);