text

;(function($) {

	$.extend($.fn, {
		treeview_addon:function(options){
			var defaults = {
				jsonArray : null,
				jsonUrl:"",//通过url获取json数据,暂时未完成。
					/*in the jsonArray,the key of json will become the a tag's href or the value of the input tag, 
						and the value is also a json data made by two key-value, "text"(string,the display text of the tree's leaves) and "children"(jsonArray,the children of this 
						 branch).
					eg.	 [
							{
								"1":{
									"text":"Item1",
									"children":
										[
											{
												"2":{
														"text":"Item2",
														"children":[]
													}
											}
										]
									}
							}
						 ]
					*/
				inputType:false,/*you can choose checkbox,radio. if you don't want input support, you can write false*/
				inputName:false,
				leavesTag:"span",/*just like the treeview support, you can use a or span, */
				folderAHref:"",/*文件夹的链接,未完成*/
				fileAhref:"",/*文件的链接,未完成*/
				checkedArray:[],/*已经选择的列表,数组的元素是checkbox的value值。正在完成。。*/
					
				partCheckedImageSrc:"./treeviewaddon/partChecked.jpg",
				
				
				
				/*properties below belong to jquery.treeview*/
				
				control: null,
				animated: "fast",
				collapsed: true,
				unique: true,
				persist: "cookie",
				toggle: function() {}
			};
			var options = $.extend(defaults,options);
			var $this=$(this);
			if(options.jsonArray!=null){
				$this.html(getTreeHtml(options.jsonArray));
			}
			$this.treeview({
				animated: options.animated,
				persist: options.persist,
				collapsed: options.collapsed,
				unique: options.unique,
				toggle: options.toggle
			})
			
			/*初始化已经选择的input标签*/
			if(options.checkedArray.length>0){
				for(var i in options.checkedArray){
					$this.find("li input[value='"+options.checkedArray[i]+"']").attr("checked",true);
				}
			}
			if(options.inputType=="checkbox"){
			
				var inputs=$this.find("input:"+options.inputType);
				inputs.click(function(e){
					updateCheckBoxStates($(this));
				}).each(function(index, element) {
					var input=inputs.eq(index);
					if(input.nextAll("ul").length==0){
						updateCheckBoxParentsStates(input);
					}
				});
			}
			
			
			function getTreeHtml(jsonArray){
				var treeHtml="";

				recurseTreeHtml(jsonArray);
				return treeHtml;
				
				function recurseTreeHtml(jsonArray){
					
					for(var i =0;i"+treeItem.text+"";
						
						if(treeItem.children.length>0){
							treeHtml+="
"
							recurseTreeHtml(treeItem.children);
							treeHtml+="
";
						}
						
						treeHtml+=""
					}		
				};
				
			}
			
			function updateCheckBoxStates($this)
			{
				if($this.attr("checked")=="checked"||$this.attr("checked")==true)
				{
					//update lower chechbox's states
					$this.nextAll("ul").find("input:"+options.inputType).attr("checked",true)
						.css("display","inline").next("img").remove();
					//update upper chechbox's states
					updateCheckBoxParentsStates($this);
				}else{
					//update lower chechbox's states
					$this.nextAll("ul").find("input:"+options.inputType).attr("checked",false)
						.next("img").css("display","inline").remove();
					//update upper chechbox's states
					updateCheckBoxParentsStates($this);
				}
			}
			
			
			//update the states of the upper checkbox 
			function updateCheckBoxParentsStates($this)
			{
				var parents = findCheckBoxParents($this);
				for(i in parents){
					var parent=parents[i];
					var children=parent.nextAll("ul").find("input:"+options.inputType);
					var allChecked=true;
					var allNotChecked=true;
					children.each(function(ind){
						if(children.eq(ind).attr("checked")=="checked"||children.eq(ind).attr("checked")==true){
							allNotChecked=false;
						}else{
							allChecked=false;
						}
					});
					if(allChecked){
						parent.attr("checked",true);
							if(parent.next().is("img")){
								parent.css("display","inline").next("img").remove();
							}
					}else if(allNotChecked){
						parent.attr("checked",false);
							if(parent.next().is("img")){
								parent.css("display","inline").next("img").remove();
							}
					}else{
						parent.attr("checked",false);
						if(!parent.next().is("img")){
							parent.css("display","none").after("")
								.next("img").click(function(){
									parent.click();
									if(parent.attr("checked")=="checked"||parent.attr("checked")==true){
										parent.css("display","inline").next("img").remove();
									}else{
										parent.css("display","none").after("");
									}
									updateCheckBoxStates(parent);
								});
						}
						//css("background","url(./images/partChecked.jpg)");
					}
				}
						
			}
			
			//find the upper checkbox
			function findCheckBoxParents(c)
			{
				var checkBoxParents=new Array();
				function pushCheckBoxParent(cc)
				{
					//alert(cc.parent().parent().html());
					var checkBoxParent=cc.parent().parent().prevAll("input:"+options.inputType);
					if(checkBoxParent.length>0){
						checkBoxParents.push(checkBoxParent);
						pushCheckBoxParent(checkBoxParent);
					}
				}
				
				pushCheckBoxParent(c);
				return checkBoxParents;
				
			}
			
		}
	});
	
})(jQuery);