﻿///////////////////////////////////////////////////////////////////
//JavaScript:   jPListInspector.js
//Description:  Demonstrate jPoint.Lists functions
///////////////////////////////////////////////////////////////////
//myjLocalOptions are required from the webpart content editor page
if(typeof myjLocalOptions === "undefined") myjLocalOptions = null;

var myjOptions = {
	Plugin:{
		Name:'jPListInspector'
		, Version:'1.0'
		, Origin:'jPoint Team'
		, Description:'View and demonstrate jPoint features for SharePoint lists'
		, Developer:'Ken Le'
	}, 
	Local:myjLocalOptions
	};
	
var myOptionDefinition = [	
	["ID","Unique identifier","jPListInspector"]
    ,["SiteURL","Site URL to retrieve lists","http://www.sharejpoint.com/dev/examples"]
	];


var myOptionDefaults = {};
var myOptionsDescriptions = {};

//field, description, default value
function getOptionDefaults() {	
	myOptionDefaults = {};
	myOptionDescriptions = {};
	
	for (var i=0; i<myOptionDefinition.length; i++) {
		myOptionDescriptions[myOptionDefinition[i][0]] = myOptionDefinition[i][1];
		myOptionDefaults[myOptionDefinition[i][0]] = myOptionDefinition[i][2];
	}
}


//Configure webpart and store info into memory for later access
jP.config(myjOptions);

//Override webpart functions
myjWebpart.readConfig = function ()
{
	var webpartOptions = {};
	$("input[id^='CfgField']").each(function(idx, item) {
		webpartOptions[item.id.substr(8)] = item.value;
	});
	this.Options.Local = webpartOptions;

}
myjWebpart.showConfig = function () {
	var configTable = this.ConfigTableDiv;
	
	getOptionDefaults();
	
	//Use default options if option has not been updated
	if (this.Options.Local == undefined || this.Options.Local == null)
		var webpartOptions = myOptionDefaults;
	else
		var webpartOptions = this.Options.Local;

	//Remove all previously created config nodes
	$(configTable).find(".configRow").remove();

	configTable.append("<tr class='configRow'>"
			+"<td colspan=2>"
			+"<div id=CONFIGTABLE></div>"
			+"</td>"
			+"</tr>");
	//Append config fields
	var tbl = "<table>";
	$.each(webpartOptions, function(name, val) {
		tbl += ("<tr class='configRow'>"
			+"<td width='100px'>" + name + "</td>"
			+"<td><input type='text' id='CfgField"+name+"' name='" + name + "' value='" + val + "' size='30'/></td>"
			+"<td>" + myOptionDescriptions[name] + "</td>"
			+"</tr>"); 
	});	
	tbl +="</table>";
	$("#CONFIGTABLE").append(tbl);

}

//Start Webpart logic code ----------------------------------- 
$(document).ready(function() { //Wait page to load and then apply webpart logic
	if(myjWebparts[myjOptions.Plugin.Name] != null)
	{		
		var thisWebpart = myjWebparts[myjOptions.Plugin.Name];
		if(thisWebpart.Options.Local != null)
		{	
			var thisOpt = thisWebpart.Options.Local;				
			jPListInspector(thisOpt)
		}
	}

	function jPListInspector(opts) {
		var diagdiv = "#WSTestDiv";
	   	var diagtbl = "#WSTestTable";
	   	var resultdiv = "#WSTestResultDiv";
		var result;
	
		var siteUrl = opts.SiteURL;
	
		$("script[src*='jPListInspector.js']").parent().append("<div id='"+diagdiv.substr(1)+"'></div>")
	
		$(diagdiv).append(setStyle());
	
		var tbl = "";
		tbl = "<table border=1 id='"+diagtbl.substr(1)+"' style='{font-family:verdana,arial,helvetica,sans-serif; font-size:8pt;}'>";
	   	tbl += infoRow("<b></b>", "<b>TryIt</b>", "<b>jPoint Script</b>", "<b>Example</b>")
	   	tbl += "</table>";
		$(diagdiv).append(tbl);
			
		var opts = '<option>'+jP.WebServices.GetListCollection().find('List').Attrs('Title').join('</option><option>')+'</option>';
		var code = "";
		
		code = "var siteurl = \""+siteUrl+"\";";
		code += "<br>var listname = \"~~~ReplaceMeText~~~\";";
		code += "<br>jP.Lists.setSPObject(siteurl, listname).getSPView();"
		addTryItAction({
			title:"getSPView()",
			js:code, 
			input:"<select id='~~~ReplaceMeInput~~~' style='{width:200px}' >"+opts+"</select>",
			desc:"Get list items from default list view"
		});
		
		code = "var siteurl = \""+siteUrl+"\";";
		code += "<br>var listname = \"~~~ReplaceMeText~~~\";";
		code += "<br>var viewname = \"~~~ReplaceMeText2~~~\";";
		code += "<br>jP.Lists.setSPObject(siteurl, listname).getSPView(viewname);"
		addTryItAction({
			title:"getSPView(viewname)", 
			js:code, 
			input:"<select id='~~~ReplaceMeInput~~~' style='{width:200px}' >"+opts+"</select>",
			input2:"<select id='~~~ReplaceMeInput2~~~' style='{width:200px}' >"+"~~~ReplaceMeInputOpts2~~~"+"</select>",
			siteurl:siteUrl,
			ddltype:"listviews",
			desc:"Get list items from specifed viewname"
		});

		code = "var siteurl = \""+siteUrl+"\";";
		code += "<br>var listname = \"~~~ReplaceMeText~~~\";";
		code += "<br>jP.Lists.setSPObject(siteurl, listname).getSPViewCollection();"
		addTryItAction({
			title:"getSPViewCollection()", 
			js:code, 
			input:"<select id='~~~ReplaceMeInput~~~' style='{width:200px}' >"+opts+"</select>",
			desc:"Get list view collection"
		});
		
		code = "var siteurl = \""+siteUrl+"\";";
		code += "<br>var listname = \"~~~ReplaceMeText~~~\";";
		code += "<br>var mylist = jP.Lists.setSPObject(siteurl, listname);"
		code += "<br>mylist.getSPViewCollection(); "
		code += "<br>var myitems = mylist.filterItems('DefaultView', 'TRUE');"
		addTryItAction({
			title:"filterItems to get default view", 
			js:code, 
			input:"<select id='~~~ReplaceMeInput~~~' style='{width:200px}' >"+opts+"</select>",
			desc:"Get list view collection, then get item with DefaultView contains TRUE"
				+"<br>filterItems(filterField, filterValue) //filter current list object Items"
		});
		
		addTryItAction({
			title:"filterItems chaining", 
			js:"var myitems = jP.Lists.setSPObject('"+siteUrl+"', '~~~ReplaceMeText~~~').getSPViewCollection().filterItems('DefaultView', 'TRUE');", 
			input:"<select id='~~~ReplaceMeInput~~~' style='{width:200px}' >"+opts+"</select>",
			desc:"Chaining function calls"
		});
					
		//var code = "var mylist = jP.Lists.setSPObject('"+siteUrl+"', '~~~ReplaceMeText~~~'); "
		code = "var siteurl = \""+siteUrl+"\";";
		code += "<br>var listname = \"~~~ReplaceMeText~~~\";";
		code += "<br>var myid = \"~~~ReplaceMeText2~~~\";  //Title=<span id='~~~ReplaceMeInputInfo~~~'/>";
		code += "<br>var mylist = jP.Lists.setSPObject(siteurl, listname);"
		code += "<br>var myitems = mylist.getSPItem(myid).Items;"
		addTryItAction({
			title:"getSPItem(ID)", 
			js:code, 
			input:"<select id='~~~ReplaceMeInput~~~' style='{width:200px}' >"+opts+"</select>",
			input2:"<select id='~~~ReplaceMeInput2~~~' style='{width:50px}' >"+"~~~ReplaceMeInputOpts2~~~"+"</select>",
			siteurl:siteUrl,
			ddltype:"itemsid",
			desc:"Get list item by ID"
		});
	
		code = "var siteurl = \""+siteUrl+"\";";
		code += "<br>var listname = \"~~~ReplaceMeText~~~\";";
		code += "<br>var mylist = jP.Lists.setSPObject(siteurl, listname);"
		code += "<br>mylist.getSPListFields(); "
		addTryItAction({
			title:"getSPListFields()", 
			js:code, 
			input:"<select id='~~~ReplaceMeInput~~~' style='{width:200px}' >"+opts+"</select>",
			desc:"Get list fields schema"
		});
	
		code = "var siteurl = \""+siteUrl+"\";";
		code += "<br>var listname = \"~~~ReplaceMeText~~~\";";
		code += "<br>var mylist = jP.Lists.setSPObject(siteurl, listname);"
		code += "<br>var qry = \"&lt;OrderBy&gt;&lt;FieldRef Name='ID' Ascending='TRUE' /&gt;&lt;/OrderBy&gt;\";"
		code += "<br>var myitems = mylist.getSPItemsWithQuery(qry).Items;"
		addTryItAction({
			title:"getSPItemsWithQuery(caml)", 
			js:code, 
			input:"<select id='~~~ReplaceMeInput~~~' style='{width:200px}' >"+opts+"</select>",
			desc:"Get list item by CAML query"
		});
	
		code = "var siteurl = \""+siteUrl+"\";";
		code += "<br>var listname = \"~~~ReplaceMeText~~~\";";
		code += "<br>var mylist = jP.Lists.setSPObject(siteurl, listname);"
		code += "<br>var qry = \"&lt;OrderBy&gt;&lt;FieldRef Name='ID' Ascending='TRUE' /&gt;&lt;/OrderBy&gt;\";"
		code += "<br>var myitems = mylist.getSPItemsWithQuery(qry, 3);"
		addTryItAction({
			title:"getSPItemsWithQuery(caml, rowlimit)", 
			js:code, 
			input:"<select id='~~~ReplaceMeInput~~~' style='{width:200px}' >"+opts+"</select>",
			desc:"Get list items by CAML query with rowlimit"
		});
	
		code = "var siteurl = \""+siteUrl+"\";";
		code += "<br>var listname = \"jpListInspectorList\";";
		code += "<br>var mylist = jP.Lists.setSPObject(siteurl, listname);"
		code += "<br>var result = mylist.addItem([{Title:'~~~ReplaceMeText~~~'}]); ";
		addTryItAction({
			title:"addItem()", 
			js:code, 
			input:"<input id='~~~ReplaceMeInput~~~' value='"+"My text value"+"' style='{width:100px}' />",
			desc:"Add new item to list"
		});

		code = "var siteurl = \""+siteUrl+"\";";
		code += "<br>var listname = \"jpListInspectorList\";";
		code += "<br>var mylist = jP.Lists.setSPObject(siteurl, listname);"
		code += "<br>var itemid = ~~~ReplaceMeText2~~~;  /*Title=<span id='~~~ReplaceMeInputInfo~~~'/>*/";
		code += "<br>var newval = \"~~~ReplaceMeText~~~\";";
		code += "<br>var result = mylist.updateItem([{id:itemid,Title:newval}]); ";
		addTryItAction({
			title:"updateItem()", 
			js:code, 
			input:"<input id='~~~ReplaceMeInput~~~' value='"+"My text value"+"' style='{width:100px}' />",
			input2:"<select id='~~~ReplaceMeInput2~~~' style='{width:50px}' >"+"~~~ReplaceMeInputOpts2~~~"+"</select>",
			siteurl:siteUrl,
			listname:"jpListInspectorList",
			ddltype:"itemsid",
			desc:"Update an existing list item"
		});

		code = "var siteurl = \""+siteUrl+"\";";
		code += "<br>var listname = \"jpListInspectorList\";";
		code += "<br>var mylist = jP.Lists.setSPObject(siteurl, listname);"
		code += "<br>var itemJSON = {};"
		code += "<br>itemJSON.id = ~~~ReplaceMeText2~~~;  /*Title=<span id='~~~ReplaceMeInputInfo~~~'/>*/";
		code += "<br>itemJSON.Title = \"~~~ReplaceMeText~~~\";";
		code += "<br>var result = mylist.updateItem([itemJSON]); ";
		addTryItAction({
			title:"updateItem() with JSON", 
			js:code, 
			input:"<input id='~~~ReplaceMeInput~~~' value='"+"My text value"+"' style='{width:100px}' />",
			input2:"<select id='~~~ReplaceMeInput2~~~' style='{width:50px}' >"+"~~~ReplaceMeInputOpts2~~~"+"</select>",
			siteurl:siteUrl,
			listname:"jpListInspectorList",
			ddltype:"itemsid",
			desc:"Update an existing list item"
		});

		code = "var siteurl = \""+siteUrl+"\";";
		//code += "<br>var listname = \"~~~ReplaceMeText~~~\";";
		code += "<br>var listname = \"LookupList\";";
		code += "<br>var mylist = jP.Lists.setSPObject(siteurl, listname);";
		code += "<br>var qry = \"&lt;OrderBy&gt;&lt;FieldRef Name='ID' Ascending='TRUE' /&gt;&lt;/OrderBy&gt;\";";
		code += "<br>var myitems = mylist.getSPItemsWithQuery(qry).getItemsFieldData(['LinkTitle','Office','Cell']);";		
		addTryItAction({
			title:"getItemsFieldData(fieldNames)", 
			js:code, 
			//input:"<select id='~~~ReplaceMeInput~~~' style='{width:200px}' >"+opts+"</select>",
			desc:"Get a subset of Items with specified fields"
		});

		code = "var siteurl = \""+siteUrl+"\";";
		code += "<br>var listname = \"~~~ReplaceMeText~~~\";";
		code += "<br>var fieldarray = ~~~ReplaceMeText2~~~; /*array of field names*/";
		code += "<br>var mylist = jP.Lists.setSPObject(siteurl, listname);";
		code += "<br>var qry = \"&lt;OrderBy&gt;&lt;FieldRef Name='ID' Ascending='TRUE' /&gt;&lt;/OrderBy&gt;\";";
		code += "<br>mylist.getSPItemsWithQuery(qry);";		
		code += "<br>var myitems = mylist.getItemsFieldData(fieldarray);";		
		addTryItAction({
			title:"getItemsFieldData(fieldNames) //your own", 
			js:code, 
			siteurl:siteUrl,
			input:"<select id='~~~ReplaceMeInput~~~' style='{width:200px}' >"+opts+"</select>",
			input2:"<input id='~~~ReplaceMeInput2~~~' value='"+"[\"LinkTitle\",\"Office\",\"Cell\"]"+"' style='{width:200px}' />",
			ddltype:"fieldsarray",
			desc:"Get a subset of Items with your specified fields"
		});

		/*
		code = "var siteurl = \""+siteUrl+"\";";
		code += "<br>var listname = \"~~~ReplaceMeText~~~\";";
		code += "<br>var myitems = jP.Lists.setSPObject(siteurl, listname).getSPView().Items;"
		code += "<br>debugger; //myitems = myitems.Attrs('Region');"
		addTryItAction({
			title:"Test Attrs",
			js:code, 
			input:"<select id='~~~ReplaceMeInput~~~' style='{width:200px}' >"+opts+"</select>",
			desc:"Get list items from default list view"
		});
		*/
		
		$(diagdiv).append("<div id='"+resultdiv.substr(1)+"'></div>");
		
		function InspectList(listname) {
			var splist = jP.Lists.setSPObject(siteUrl, listname);
			splist.getSPView();
			dispResult(splist, "");
		}
		function test() {
			var splist = jP.Lists.setSPObject(siteUrl, listName);
			debugger;
			splist.getSPView();
			var data = splist.JQueryData;
			var items = splist.Items;
			var x = "";
			var y = splist.filterItems("AssignedTo", "Ken");
			var z = $(items).find("AssignedTo*='Ken'");
			dispResult(splist, "");
	
			debugger;
		}
		function addTryItAction(opt) {
			//title, js, input, div, desc
			var button = "Run";
			var id = "jP"+opt.title.replace(/ /g, "").replace(/[^A-Za-z0-9]+/g, "");
			if (typeof opt.input != "undefined") {
				var inputid = id+"_Input";
				var textid = id+"_Input";
				var inputid2 = id+"_Input2";
				var textid2 = id+"_Input2";
				var inputinfo = id+"_InputInfo";
				
				var inputhtm = opt.input.replace("~~~ReplaceMeInput~~~", inputid)
				var codehtm = opt.js.replace("~~~ReplaceMeText~~~", inputhtm)			
				if (typeof opt.input2 != "undefined") {
					var inputhtm2 = opt.input2.replace("~~~ReplaceMeInput2~~~", inputid2)
					codehtm = codehtm.replace("~~~ReplaceMeText2~~~", inputhtm2)
					codehtm = codehtm.replace("~~~ReplaceMeInputInfo~~~", inputinfo)
				}				
				if (typeof opt.desc == "undefined")
					opt.desc = "";
				var s = infoRow(""
					,"<span id='"+id+"_codebtn' class='BtnLink'>[TryIt]</span>"
						+ "<br><span id='"+id+"_runbtn' class='BtnLink'>["+button+"]</span>"
					,opt.desc + "&nbsp;<div id='"+id+"_code'><br/>"+codehtm+"</div>"
					,opt.title
					,"TryItRow"
					,"TryItRow")
				
				$(diagtbl).append(s);

				if ($("#"+inputid2).length > 0) {
					if (opt.ddltype == "listviews")
						setListViewDDL(inputid, inputid2, opt);
					if (opt.ddltype == "itemsid")
						setListItemsIdDDL(inputid, inputid2, opt);
					if (opt.ddltype == "fieldsarray")
						setSampleFieldNamesArray(inputid, inputid2, opt);
					if ($("#"+inputinfo).length > 0)
				    	setInputInfo(inputid, inputid2, inputinfo, opt);
				}
		    	$("#"+inputid).change(function(){
					if ($("#"+inputid2).length > 0) {
						if (opt.ddltype == "listviews")
							setListViewDDL(inputid, inputid2, opt);
						if (opt.ddltype == "itemsid")
							setListItemsIdDDL(inputid, inputid2, opt);
						if (opt.ddltype == "fieldsarray")
							setSampleFieldNamesArray(inputid, inputid2, opt);
					}
		    	});
		    	$("#"+inputid2).change(function(){
					if ($("#"+inputinfo).length > 0) {
				    	setInputInfo(inputid, inputid2, inputinfo, opt);
					}
		    	});
				
				/*
				$("#"+id+"_code").hide();				  		
		    	$("#"+id+"_codebtn").click(function(){
		    		if ($("#"+id+"_code").css("display") == "block") {
						$("#"+id+"_code").toggle();				  				    		
				    	$("#"+id+"_runbtn").toggle(); 
		    		}
		    		else {
						$("div[id$='_code']").hide();				  				    		
						$("span[id$='_runbtn']").hide();				  				    		
						$("#"+id+"_code").show("slow");				  				    		
				    	$("#"+id+"_runbtn").show("slow"); 
			    	}
			    	$(resultdiv).html("");
		    	});
		    	*/
		    	setTryItButton(id, resultdiv) 
		    	$("#"+id+"_runbtn").hide(); 
		    	$("#"+id+"_runbtn").click(function(){ 
		    		$(resultdiv).html("");
		  			var userinput = $("#"+inputid).val();
					var codehtm = opt.js.replace("~~~ReplaceMeText~~~", userinput) 
					if ($("#"+inputid2).length>0) {   	
		  				var userinput2 = $("#"+inputid2).val();
						codehtm = codehtm.replace("~~~ReplaceMeText2~~~", userinput2)    	
		  				//var inputinfo = $("#"+inputinfo).val();
						//codehtm = codehtm.replace("~~~ReplaceMeInputInfo~~~", inputinfo)    	
					}
		    		codehtm = codehtm.replace(/&lt;/g,"<").replace(/&gt;/g,">")
					codehtm = codehtm.replace(/<br>/g, "");
		    		//setTryItStatus("" + codehtm); 
		    		//alert(codehtm);
		    		//debugger;
		    		var res = eval(codehtm);
		    		if (typeof listname == "undefined")
		    			var listname = jP.Lists.ListName;
		    		else
		    			listname = listname.toUpperCase();
		    		if (typeof myitems != "undefined")
		    			dispResult(jP.Lists[listname], myitems); 
		    		else if (typeof result != "undefined")
		    			dispResult(jP.Lists[listname], result); 
		    		else
		    			dispResult(jP.Lists[listname], ""); 
		    	});		    	
			}
			else {
	    		$(resultdiv).html("");
				//var scr = opt.div ? opt.js+opt.div : opt.js 
				//var s = infoRow("", "<span id='"+id+"' class='BtnLink'>["+button+"]</span>", scr, opt.title, "TryItRow", "TryItRow")
				var codehtm = opt.js;
				var s = infoRow(""
					,"<span id='"+id+"_codebtn' class='BtnLink'>[TryIt]</span>"
						+ "<br><span id='"+id+"_runbtn' class='BtnLink'>["+button+"]</span>"
					,opt.desc + "&nbsp;<div id='"+id+"_code'><br/>"+codehtm+"</div>"
					,opt.title
					,"TryItRow"
					,"TryItRow")
		
				$(diagtbl).append(s);
				/*
				$("#"+id+"_code").hide();				  		
		    	$("#"+id+"_codebtn").click(function(){
					$("#"+id+"_code").toggle();				  				    		
			    	$("#"+id+"_runbtn").toggle(); 
			    	$(resultdiv).html("");
		    	});
		    	*/
		    	setTryItButton(id, resultdiv) 
 
		    	$("#"+id+"_runbtn").hide(); 
		    	$("#"+id+"_runbtn").click(function(){ 
		    		$(resultdiv).html("");
		    		//debugger;
		    		var codehtm = opt.js.replace(/&lt;/g,"<").replace(/&gt;/g,">")
					codehtm = codehtm.replace(/<br>/g, "");		    		
		    		var result = eval(codehtm);
		    		//if (opt.js.indexOf("jP.Lists") >= 0) {
			    	//	//var listname = jP.Lists.ListName;
			    	//	dispResult(jP.Lists[listname], ""); 
		    		//}
		    		//if (opt.js.indexOf("jP.WebServices") >= 0)
		    		//	dispResult2(jP.WebServices.Result, "");	    			

					if (codehtm.indexOf("jP.Lists") >= 0) {
			    		if (typeof listname == "undefined")
			    			var listname = jP.Lists.ListName;
			    		else
			    			listname = listname.toUpperCase();
			    			
			    		if (typeof myitems != "undefined")
			    			dispResult(jP.Lists[listname], myitems); 
			    		else if (typeof result != "undefined")
			    			dispResult(jP.Lists[listname], result); 
			    		else
			    			dispResult(jP.Lists[listname], ""); 
					}
		    		if (opt.js.indexOf("jP.WebServices") >= 0)
		    			dispResult2(jP.WebServices.Result, "");	    			

		    	});
			}
			return s;
		}
		function setTryItButton(id, resultdiv) {
			$("#"+id+"_code").hide();				  		
	    	$("#"+id+"_codebtn").click(function(){
	    		if ($("#"+id+"_code").css("display") == "block") {
					$("#"+id+"_code").toggle();				  				    		
			    	$("#"+id+"_runbtn").toggle(); 
	    		}
	    		else {
					$("div[id$='_code']").hide();				  				    		
					$("span[id$='_runbtn']").hide();				  				    		
					$("#"+id+"_code").show("slow");				  				    		
			    	$("#"+id+"_runbtn").show("slow"); 
		    	}
		    	$(resultdiv).html("");
	    	}); 
		}
		function setListViewDDL(inputid, inputid2, opt) {
			var parentval = $("#"+inputid).val();
    		var list = jP.Lists.setSPObject(opt.siteurl,parentval);
	    	var data = list.getSPViewCollection();
	    	var items = data.Items;
	    	var viewopts = ""
	    	$.each(items, function(){
				viewopts += '<option>'+this.DisplayName+'</option>';
	    	});
			$("#"+inputid2).html(viewopts);
		}
		function setListItemsIdDDL(inputid, inputid2, opt) {
			if (typeof opt.listname != "undefined") //if listname available
				var parentval = opt.listname; 
			else
				var parentval = $("#"+inputid).val();
    		var list = jP.Lists.setSPObject(opt.siteurl,parentval);
	    	var data = list.getSPItemsWithQuery("<OrderBy><FieldRef Name='ID' Ascending='TRUE' /></OrderBy>");
	    	var items = data.Items;
	    	var viewopts = ""
	    	if (typeof items != "undefined") {
		    	$.each(items, function(){
					//viewopts += '<option value='+this.ID+'>'+this.ID+ ' - ' + this.LinkTitle +'</option>';
					viewopts += '<option value='+this.ID+'>'+this.ID+'</option>';
		    	});
			}
			$("#"+inputid2).html(viewopts);
		}
		function setSampleFieldNamesArray(inputid, inputid2, opt) {
			if (typeof opt.listname != "undefined") //if listname available
				var listname = opt.listname; 
			else
				var listname = $("#"+inputid).val();
    		var list = jP.Lists.setSPObject(opt.siteurl,listname);
	    	var data = list.getSPItemsWithQuery("<OrderBy><FieldRef Name='ID' Ascending='TRUE' /></OrderBy>");
	    	var items = data.Items;
	    	var arrayStr = "";
	    	if (typeof items != "undefined" && $.isArray(items)) {
	    		var fields = jP.Lists[listname.toUpperCase()].Fields;
		    	$.each(items[0], function(n, v){ //look at first record
		    		var fldname = n;
		    		var fldval = v;
		    		if (fldval.match(/[^ A-Za-z:\(\)\\\/!-]/) == null) //if match any of these char, skip
		    			arrayStr += "\"" + fldname + "\",";
		    	});
		    	if (arrayStr.indexOf(",")>0) {
		    		arrayStr = arrayStr.substr(0,arrayStr.length-1)
		    	}
			}
    		arrayStr = "[" + arrayStr + "]";
			$("#"+inputid2).val(arrayStr);
		}
		function setInputInfo(inputid, inputid2, inputinfo, opt) {
			if (typeof opt.listname != "undefined") //if listname available
				var parentval = opt.listname; 
			else
				var parentval = $("#"+inputid).val();
			var luid = $("#"+inputid2).val();	
    		var list = jP.Lists.setSPObject(opt.siteurl,parentval);
    		var where = "<Where><Eq><FieldRef Name='ID' /><Value Type='Text'>" + luid + "</Value></Eq></Where>"
	    	var data = list.getSPItemsWithQuery(where+"<OrderBy><FieldRef Name='ID' Ascending='TRUE' /></OrderBy>");
	    	var items = data.Items;
	    	if (typeof items != "undefined")
				$("#"+inputinfo).html(items[0].LinkTitle);
		}
		function dispResult(splist, myitems) {
			if (typeof splist == "undefined") return;
			var tbl = "";
			var row1 = true;
			var data = splist.Items
			var listname = splist.ListName.toUpperCase();
			var listref = listname.indexOf(" ")<0 ? "."+listname : "[\""+listname+"\"]" 
			var f = [
				'jP.Lists["'+listname+'"].SiteURL',
				'jP.Lists["'+listname+'"].ListName',
				'jP.Lists["'+listname+'"].ViewName',
				'jP.Lists["'+listname+'"].FieldCount',
				'jP.Lists["'+listname+'"].ItemCount'
				];
			var info = "";
			info += "<table>"
			for (var i=0; i<f.length; i++) {
				info += "<tr><td valign=top>"+f[i] + "</td><td valign=top>" + eval(f[i]) + "</td></tr>";	
			}
			var camlquery = splist.CamlQuery;
			camlquery = camlquery.replace(/</g,"&lt;").replace(/>/g,"&gt;");
			//info += "<tr><td valign=top>"+'jP.Lists.'+listname+'.CamlQuery' + "</td><td valign=top>" + camlquery + "</td></tr>";	
			info += "<tr><td valign=top>"+ "<span id='ResultCamlQueryBtn' class='BtnLink'>+jP.Lists"+listref+".CamlQuery</span>" + "</td><td><div id='ResultCamlQuery'>" + camlquery + "</div></td></tr>";
	
			//xmlDoc
			var xmlString = xmlDoc2String(splist.xmlDoc);
			//debugger;
			if (typeof xmlString != "undefined" && xmlString != "") {
				xmlString = xmlString.replace(/</g,"&lt;").replace(/>/g,"&gt;");
				info += "<tr><td valign=top>"+ "<span id='ResultXmlDocBtn' class='BtnLink'>+jP.Lists"+listref+".xmlDoc</span>" + "</td><td><div id='ResultXmlDoc'>" + xmlString + "</div></td></tr>";
				//info += "</table>"
			}
		
			//Fields
			tbl = "<table border=0>"+ showObj(splist.Fields, "jP.Lists"+listref+".Fields", "splistfields", 1) +"</table>"
			info += "<tr><td valign=top>"+ "jP.Lists"+listref+".Fields" + "</td><td valign=top>" + tbl + "</td></tr>";	
				
			//Items		
			if ($.isArray(splist.Items)) {
				tbl = "<table border=0>"+ showObj(splist.Items, "jP.Lists"+listref+".Items", "splist", 1) +"</table>";
				info += "<tr><td valign=top>"+ "jP.Lists"+listref+".Items" + "</td><td valign=top>" + tbl + "</td></tr>";	
				tbl = dispItemsTable(jP.Lists[splist.ListName.toUpperCase()].Items);
				info += "<tr><td valign=top>"+ "<span id='ItemsTableViewBtn' class='BtnLink'>"+"+jP.Lists"+listref+".Items Table View"+"</span>" + "</td><td><div id='ItemsTableView'>" + tbl + "</div></td></tr>";
			}
			//Schema		
			if ($.isArray(splist.Schema)) {
				tbl = "<table border=0>"+ showObj(splist.Schema, "jP.Lists"+listref+".Schema", "splistschema", 1) +"</table>";
				info += "<tr><td valign=top>"+ "jP.Lists"+listref+".Schema" + "</td><td valign=top>" + tbl + "</td></tr>";	
				tbl = dispItemsTable(jP.Lists[splist.ListName.toUpperCase()].Schema);
				info += "<tr><td valign=top>"+ "<span id='SchemaTableViewBtn' class='BtnLink'>"+"+jP.Lists"+listref+".Schema Table View"+"</span>" + "</td><td><div id='SchemaTableView'>" + tbl + "</div></td></tr>";
			}
			//myitems	
			if ($.isArray(myitems)) {
				tbl = "<table border=0>"+ showObj(myitems, "myitems", "splistitems", 1) +"</table>";
				info += "<tr><td valign=top>"+ "myitems" + "</td><td valign=top>" + tbl + "</td></tr>";	
				tbl = dispItemsTable(myitems);
				//info += "<tr><td valign=top>"+ "myitems Table View" + "</td><td valign=top>" + tbl + "</td></tr>";	
				info += "<tr><td valign=top>"+ "<span id='MyItemsTableViewBtn' class='BtnLink'>"+"+myitems Table View"+"</span>" + "</td><td><div id='MyItemsTableView'>" + tbl + "</div></td></tr>";
			}
			else if (typeof myitems == "object") {
				info += showObj(myitems, "result", "result", 1);
			}
	
			$(resultdiv).html("<div id='ResultTableDiv'><hr><h2>"+splist.ListName.toUpperCase()+" Result:</h2>"+info+"</div>");
	
			addSpanToggle("ResultCamlQuery");
			addSpanToggle("ResultXmlDoc");
			addSpanToggle("ItemsTableView");
			addSpanToggle("SchemaTableView");
			addSpanToggle("MyItemsTableView");
			makeResultTree(true);
		}
		function addSpanToggle(id) {
			$("#"+id).hide();
			$("#"+id+"Btn").click(function(){
				$("#"+id).toggle();
				var ht = $("#"+id+"Btn").html();
				if (ht.indexOf("+")>=0) {
					ht = ht.replace("+", "-");
				}
				else if (ht.indexOf("-")>=0) {
					ht = ht.replace("-", "+");
				}
				$("#"+id+"Btn").html(ht);				
			});
		}
		function dispResult2(result, elem) {
			if (typeof result == "undefined") return;
			var tbl = "";
			var row1 = true;
			var data = result.data
			var f = ['jP.WebServices.Result.service','jP.WebServices.Result.operation','jP.WebServices.Result.siteurl','jP.WebServices.Result.resultnode'];
			var info = "";
			info += "<table>"
			for (var i=0; i<f.length; i++) {
				info += "<tr><td valign=top>"+f[i] + "</td><td valign=top>" + eval(f[i]) + "</td></tr>";	
			}
			if (!result.success) {
				var f = ['jP.WebServices.Result.success','jP.WebServices.Result.errorCode','jP.WebServices.Result.errorText','jP.WebServices.Result.responseText'];
				for (var i=0; i<f.length; i++) {
					info += "<tr><td valign=top>"+f[i] + "</td><td valign=top>" + eval(f[i]) + "</td></tr>";	
			}
			}
	
			var xmlString = xmlDoc2String(jP.WebServices.Result.xmlDoc);
			if (typeof xmlString != "undefined" && xmlString != "") {
				xmlString = xmlString.replace(/</g,"&lt;").replace(/>/g,"&gt;");
				info += "<tr><td valign=top>"+ "<span id='ResultXmlDocBtn' class='BtnLink'>+jP.WebServices.Result.xmlDoc</span>" + "</td><td><div id='ResultXmlDoc'>" + xmlString + "</div></td></tr>";
				info += "</table>"
			}
			if (result.success) {
				tbl = "<table border=0>"+ showObj(jP.WebServices.Result.data, "jP.WebServices.Result.data", jP.WebServices.Result.operation, 1) +"</table>"
			}
			$(resultdiv).html("<div id='ResultTableDiv'><hr><h2>"+result.operation+" Result:</h2>"+info+tbl+"</div>");
	
			$("#ResultXmlDoc").hide();
			$("#ResultXmlDocBtn").click(function(){
				$("#ResultXmlDoc").toggle();
				var ht = $("#ResultXmlDocBtn").html();
				if (ht.indexOf("+")>=0) {
					ht = ht.replace("+", "-");
				}
				else if (ht.indexOf("-")>=0) {
					ht = ht.replace("-", "+");
				}
				$("#ResultXmlDocBtn").html(ht);				
			});
			if (result.success) {
				makeResultTree(true);
			}		
		}
		
		function xmlDoc2String(xmlDoc) {
			var xmlString = "";
			if (typeof xmlDoc != "undefined") {
				if (window.ActiveXObject) {
					//for IE
					xmlString = xmlDoc.xml;
				}
				else { //if (document.implementation && document.implementation.createDocument) {
					//for Mozila
					if (xmlDoc.contentType == "text/xml")
						xmlString = (new XMLSerializer()).serializeToString(xmlDoc);
				}				
			}
			return xmlString;
		}
		function infoRow(c1, c2, c3, c4, rowid, rowclass) {
			if (c3 == "string" || (c1=="val" && c3=="function")) { c2 = "\"" + c2 + "\"" };
			if (rowid)
				var s = "<tr id='"+rowid+"' class='"+rowclass+"'>";
			else	
				var s = "<tr>";
			s += "<td valign=top>" + c4 + "</td>";
			s += "<td valign=top>" + c2 + "</td>";
			s += "<td valign=top>" + c3 + "</td>";
			//s += "<td valign=top>" + c1 + "</td>";
			s += "</tr>"
			return s;
		}
		function showObj(obj, jPCode, uid, idx) {
			if (typeof obj == "undefined") return "";
			var s = "";
			var cnt = 0;
			var indent0 = "&nbsp;&nbsp;&nbsp;&nbsp;";
			var indent = "";
			for (var i=1; i<idx; i++) indent += indent0;
			var rowuid = "ObjRow"+"_"+idx+"_"+uid
			if (obj.length) {
				indent = indent.substr(0, indent.lastIndexOf("&"))
				s += infoRow(rowuid+indent.length, "object array length="+obj.length, typeof(obj), indent+"+"+jPCode, rowuid, "ObjHdr");
			}
			var r = "";
			$.each(obj, function(n, v) {
				var newidx = idx+1
				var rowuid = "ObjRow"+"_"+newidx+"_"+uid
				cnt++;
				//debugger;
				if (v != null && typeof(v) == "object") {
					if (v.contentType != "text/xml" && n != "FieldXML")
						r += showObj(v, jPCode+"["+n+"]", n+uid, newidx)
				}
				else if (v == null || typeof v == "undefined") { 
					//skip 
				} 
				else {
					var dat = v.toString().replace(/</g,"&lt;").replace(/>/g,"&gt;");
					if (isNaN(n) && n.indexOf(" ")<0)
						r += infoRow(rowuid, dat, typeof(v), indent+indent0+jPCode+"."+n+"", rowuid, "ObjRow");
					else
						r += infoRow(rowuid, dat, typeof(v), indent+indent0+jPCode+"["+n+"]", rowuid, "ObjRow");
				}
			});
			if (obj.length == undefined) {
				if (cnt == 0)
					r = infoRow(rowuid, "(count="+cnt+")", typeof(obj), indent+""+jPCode, rowuid, "ObjRow") + r;
				else {
					indent = indent.substr(0, indent.lastIndexOf("&"))
					r = infoRow(rowuid+indent.length, "(count="+cnt+")", typeof(obj), indent+"+"+jPCode, rowuid, "ObjHdr") + r;
				}
			}
		
			s += r;
		
			return s;
		}
		function setStyle() {
			var stl = "<div id='jPWSStyle'><style>"
			stl += "tr.ObjHdr:hover {color:blue}"
			stl += "tr.ObjHdr {color:green; cursor:pointer;}"
	    	stl += "span.BtnLink:hover {color:#000000; text-decoration:underline}"
	    	stl += "span.BtnLink {color:#3966BF; cursor:pointer; font-weight:normal; font-size:8pt; }"
	    	stl += "span.BtnSeparator {color:#3966BF; font-weight:normal; font-size:8pt;}"
	    	stl += "tr.TryItRow {white-space:nowrap}"
	    	stl += "tr.StatusRow {background:lightyellow}"		
			stl += "</style></div>"
			return stl;
		}
		function makeResultTree(collapseAll) {
			var re = /ObjRow_(\d+)_([A-Za-z0-9]*)$/;
			if (collapseAll) {
				//Hide subrows
				$("tr[id^='ObjRow'][class='ObjRow']").hide();
				var hdr = $("tr[id^='ObjRow_'][class='ObjHdr']");
				$.each(hdr, function(){
					var row = this;
					var m = row.id.toString().match(re);
					if (m[1] != "1")	
						$(row).hide();
				});
			}
			//Add toggle function
			$("tr[id^='ObjRow'][class='ObjHdr']").click(function() {
				var h = $(this).children(":first");
				var ht = h.html();
				var expand = true;
				if (ht.indexOf("+")>=0) {
					ht = ht.replace("+", "-");
				}
				else if (ht.indexOf("-")>=0) {
					ht = ht.replace("-", "+");
					expand = false;
				}
				h.html(ht);
		
				var m = this.id.toString().match(re);
				var xid = parseInt(m[1])+1;
				if (expand) {
					var hdr = $("tr[id^='ObjRow_"+xid+"'][id$='"+m[2]+"'][class='ObjHdr']")
					if (hdr.length > 0)	hdr.show();
					$("tr[id^='ObjRow_"+xid+"'][id$='"+m[2]+"'][class='ObjRow']").show();
				}
				else {
					$("tr[id^='ObjRow_"+xid+"'][id$='"+m[2]+"'][class='ObjRow']").hide();
					
					var row = $("tr[id^='ObjRow_'][id$='"+m[2]+"'][class='ObjRow']");
					$.each(row, function(){
						var row1 = this;
						var m = row1.id.toString().match(re);
						if (m[1] != (xid-1))	
							$(row1).hide();
					});
					
		
					var hdr = $("tr[id^='ObjRow_'][id$='"+m[2]+"'][class='ObjHdr']")
					$.each(hdr, function(){
						var h = $(this).children(":first");
						var ht = h.html();
						ht = ht.replace("-", "+");
						h.html(ht);
						var row1 = this;
						var m = row1.id.toString().match(re);
						if (m[1] != (xid-1))	
							$(row1).hide();
					});
		
				}
			});
		}
		function dispItemsTable(items) {
			var tbl = {};
			var cols = {};
			$.each(items, function(n1, v1) {
				tbl[n1] = {};
				$.each(v1, function(n2, v2) {
					tbl[n1][n2] = v2;
					cols[n2] = n2;
				});
			});
			var s = "<table border=1>";
			s += "<tr>";
			$.each(cols, function(n1, v1) {
					s += "<th>"+ v1 + "</th>";			
			});
			s += "</tr>";
			$.each(items, function(n1, v1) {
				s += "<tr>";
				$.each(cols, function(n2, v2) {
					if (typeof v1[v2] != "undefined")
						s += "<td>"+ v1[v2] + "</td>";
					else			
						s += "<td>&nbsp;</td>";
				});
				s += "</tr>";
			});
			s += "</table>";
			return s;
		}
	}
});
