/*mootools patch*/

if(document.documentElement.getBoundingClientRect){//ie, opear9.5+, ff3+

	Element.implement({

		getPosition: function(relative){
			rect=this.getBoundingClientRect();
			var clientTop = document.html.clientTop || document.body.clientTop || 0, clientLeft = document.html.clientLeft || document.body.clientLeft || 0
			var position={x: rect.left-this.scrollLeft-clientLeft, y:rect.top-this.scrollTop-clientTop};
			var relativePosition = (relative && (relative = $(relative))) ? relative.getPosition() : {x: 0, y: 0};
			return {x: position.x - relativePosition.x, y: position.y - relativePosition.y};
		}
		
	});

}
if(!Mif){var Mif={}}Mif.Tree=new Class({Implements:[new Events,new Options],options:{types:{},forest:false,animateScroll:true,height:18,expandTo:true},initialize:function(a){this.setOptions(a);$extend(this,{types:this.options.types,forest:this.options.forest,animateScroll:this.options.animateScroll,dfltType:this.options.dfltType,height:this.options.height,container:$(a.container),UID:0,key:{},expanded:[]});this.defaults={name:"",cls:"",openIcon:"mif-tree-empty-icon",closeIcon:"mif-tree-empty-icon",loadable:false};this.dfltState={open:false};this.updateOpenState();if(this.options.expandTo){this.initExpandTo()}Mif.Tree.UID++;this.DOMidPrefix="mif-tree-";this.wrapper=new Element("div").addClass("mif-tree-wrapper").injectInside(this.container);this.initEvents();this.initScroll();this.initSelection();this.initHover()},initEvents:function(){this.wrapper.addEvents({mousemove:this.mouse.bindWithEvent(this),mouseover:this.mouse.bindWithEvent(this),mouseout:this.mouse.bindWithEvent(this),mouseleave:this.mouseleave.bind(this),mousedown:function(){this.fireEvent("mousedown");return false}.bind(this),click:this.toggleClick.bindWithEvent(this),dblclick:this.toggleDblclick.bindWithEvent(this),keydown:this.keyDown.bindWithEvent(this),keyup:this.keyUp.bindWithEvent(this)});if(Browser.Engine.trident){this.wrapper.addEvent("selectstart",$lambda(false))}},$getIndex:function(){this.$index=[];var a=this.forest?this.root.getFirst():this.root;do{this.$index.push(a)}while(a=a.getNextVisible())},mouseleave:function(){this.mouse.coords={x:null,y:null};this.mouse.target=false;this.mouse.node=false;if(this.hover){this.hover()}},mouse:function(a){this.mouse.coords=this.getCoords(a);var b=this.getTarget(a);this.mouse.target=b.target;this.mouse.node=b.node},getTarget:function(d){var e=d.target,c;while(!/mif-tree/.test(e.className)){e=e.parentNode}var g=e.className.match(/mif-tree-(gadjet)-[^n]|mif-tree-(icon)|mif-tree-(name)|mif-tree-(checkbox)/);if(!g){var f=this.mouse.coords.y;if(f==-1||!this.$index){c=false}else{c=this.$index[((f)/this.height).toInt()]}return{node:c,target:"node"}}for(var a=5;a>0;a--){if(g[a]){var b=g[a];break}}return{node:Mif.Tree.Nodes[e.getAttribute("uid")],target:b}},getCoords:function(c){var b=this.wrapper.getPosition();var a=c.page.x-b.x;var e=c.page.y-b.y;var d=this.wrapper;if((e-d.scrollTop>d.clientHeight)||(a-d.scrollLeft>d.clientWidth)){e=-1}return{x:a,y:e}},keyDown:function(a){this.key=a;this.key.state="down"},keyUp:function(a){this.key={};this.key.state="up"},toggleDblclick:function(a){var b=this.mouse.target;if(!(b=="name"||b=="icon")){return}this.mouse.node.toggle()},toggleClick:function(a){if(this.mouse.target!="gadjet"){return}this.mouse.node.toggle()},initScroll:function(){this.scroll=new Fx.Scroll(this.wrapper)},scrollTo:function(c){var b=c.getVisiblePosition();var d=b*this.height;var a=d<this.wrapper.scrollTop;var e=d>(this.wrapper.scrollTop+this.wrapper.clientHeight);if(b==-1||(!a&&!e)){this.scroll.fireEvent("complete");return false}if(this.animateScroll){this.scroll.start(this.wrapper.scrollLeft,d-(e?this.wrapper.clientHeight-this.height:0))}else{this.scroll.set(this.wrapper.scrollLeft,d-(e?this.wrapper.clientHeight-this.height:0));this.scroll.fireEvent("complete")}},updateOpenState:function(){this.addEvents({drawChildren:function(d){var c=d.children;for(var b=0,a=c.length;b<a;b++){c[b].updateOpenState()}},drawRoot:function(){this.root.updateOpenState()}})},expandTo:function(a){if(!a){return this}var b=[];while(!a.isRoot()&&!(this.forest&&a.getParent().isRoot())){a=a.getParent();if(!a){break}b.unshift(a)}b.each(function(c){c.toggle(true)});return this},initExpandTo:function(){this.addEvent("loadChildren",function(d){if(!d){return}var c=d.children;for(var b=c.length;b--;){var e=c[b];if(e.expandTo){this.expanded.push(e)}}});function a(){this.expanded.each(function(b){this.expandTo(b)},this);this.expanded=[]}this.addEvents({load:a.bind(this),loadNode:a.bind(this)})}});Mif.Tree.UID=0;Mif.Tree.version="1.1";Mif.Tree.Node=new Class({$family:{name:"mif:tree:node"},Implements:[new Events],initialize:function(a,b){$extend(this,a);this.children=[];this.type=b.type||this.tree.dfltType;this.property=b.property;this.data=b.data;this.state=$extend($unlink(this.tree.dfltState),b.state);this.$calculate();this.UID=Mif.Tree.Node.UID++;Mif.Tree.Nodes[this.UID]=this},$calculate:function(){$extend(this,$unlink(this.tree.defaults));this.type=$splat(this.type);this.type.each(function(b){var a=this.tree.types[b];if(a){$extend(this,a)}},this);$extend(this,this.property)},getDOM:function(b){var a=$(this.tree.DOMidPrefix+this.UID);if(b=="node"){return a}var c=a.getFirst();if(b=="wrapper"){return c}if(b=="children"){return c.getNext()}return c.getElement(".mif-tree-"+b)},getGadjetType:function(){return(this.loadable&&!this.isLoaded())?"plus":(this.hasChildren()?(this.isOpen()?"minus":"plus"):"none")},toggle:function(e){if(this.state.open==e||this.$loading||this.$toggling){return}if(this.loadable&&!this.state.loaded){if(!this.load_event){this.load_event=true;this.addEvent("load",function(){this.toggle()}.bind(this))}this.load();return}if(!this.hasChildren()){return}var c=this.getNextVisible();this.state.open=!this.state.open;e=this.state.open;if(!this.$draw){Mif.Tree.Draw.children(this)}var a=this.getDOM("children");var d=this.getDOM("gadjet");var b=this.getDOM("icon");a.style.display=this.isOpen()?"block":"none";d.className="mif-tree-gadjet mif-tree-gadjet-"+this.getGadjetType();b.className="mif-tree-icon "+this[this.isOpen()?"openIcon":"closeIcon"];this.tree.hoverState.gadjet=false;this.tree.hover();this.tree.$getIndex();this.tree.fireEvent("toggle",[this,this.state.open])},recursive:function(b,a){a=$splat(a);if(b.apply(this,a)!==false){this.children.each(function(c){if(c.recursive(b,a)===false){return false}})}return this},isOpen:function(){return this.state.open},isLoaded:function(){return this.state.loaded},isLast:function(){if(this.parentNode==null||this.parentNode.children.getLast()==this){return true}return false},isFirst:function(){if(this.parentNode==null||this.parentNode.children[0]==this){return true}return false},isRoot:function(){return this.parentNode==null?true:false},getChildren:function(){return this.children},hasChildren:function(){return this.children.length?true:false},index:function(){if(this.isRoot()){return 0}return this.parentNode.children.indexOf(this)},getNext:function(){if(this.isLast()){return null}return this.parentNode.children[this.index()+1]},getPrevious:function(){if(this.isFirst()){return null}return this.parentNode.children[this.index()-1]},getFirst:function(){if(!this.hasChildren()){return null}return this.children[0]},getLast:function(){if(!this.hasChildren()){return null}return this.children.getLast()},getParent:function(){return this.parentNode},getNextVisible:function(){var b=this;if(b.isRoot()){if(!b.isOpen()||!b.hasChildren()){return false}return b.getFirst()}else{if(b.isOpen()&&b.getFirst()){return b.getFirst()}else{var a=b;do{b=a.getNext();if(b){return b}}while(a=a.parentNode);return false}}},getPreviousVisible:function(){var a=this;if(a.isFirst()&&(!a.parentNode||(a.tree.forest&&a.parentNode.isRoot()))){return false}else{if(a.getPrevious()){a=a.getPrevious();while(a.isOpen()&&a.getLast()){a=a.getLast()}return a}else{return a.parentNode}}},getVisiblePosition:function(){return this.tree.$index.indexOf(this)},contains:function(a){do{if(a==this){return true}a=a.parentNode}while(a);return false},addType:function(a){this.type.include(a);this.$calculate();Mif.Tree.Draw.update(this);return this},removeType:function(a){this.type.erase(a);this.$calculate();Mif.Tree.Draw.update(this);return this},set:function(a){this.tree.fireEvent("beforeSet",[this]);$extend(this,a);if(a.property||a.type||a.state){this.$calculate();Mif.Tree.Draw.update(this)}this.tree.fireEvent("set",[this,a])},updateOpenState:function(){if(this.state.open){this.state.open=false;this.toggle()}}});Mif.Tree.Node.UID=0;Mif.Tree.Nodes={};
/*
Mif.Tree.Hover
*/
Mif.Tree.implement({
	
	initHover: function(){
		this.defaults.hoverClass='';
		this.wrapper.addEvent('mousemove', this.hover.bind(this));
		this.wrapper.addEvent('mouseout', this.hover.bind(this));
		this.defaultHoverState={
			gadjet: false,
			checkbox: false,
			icon: false,
			name: false,
			node: false
		};
		this.hoverState=$unlink(this.defaultHoverState);
	},
	
	hover: function(){
		var cnode=this.mouse.node;
		var ctarget=this.mouse.target;
		$each(this.hoverState, function(node, target, state){
			if(node==cnode && (target=='node'||target==ctarget)) return;
			if(node) {
				Mif.Tree.Hover.out(node, target);
				state[target]=false;
				this.fireEvent('hover', [node, target, 'out']);
			}
			if(cnode && (target=='node'||target==ctarget)) {
				Mif.Tree.Hover.over(cnode, target);
				state[target]=cnode;
				this.fireEvent('hover', [cnode, target, 'over']);
			}else{
				state[target]=false;
			}
		}, this);
	},
	
	updateHover: function(){
		this.hoverState=$unlink(this.defaultHoverState);
		this.hover();
	}
	
});

Mif.Tree.Hover={
	
	over: function(node, target){
		var wrapper=node.getDOM('wrapper');
		wrapper.addClass((node.hoverClass||'mif-tree-hover')+'-'+target);
		if(node.state.selected) wrapper.addClass((node.hoverClass||'mif-tree-hover')+'-selected-'+target);
	},
	
	out: function(node, target){
		var wrapper=node.getDOM('wrapper');
		wrapper.removeClass((node.hoverClass||'mif-tree-hover')+'-'+target).removeClass((node.hoverClass||'mif-tree-hover')+'-selected-'+target);
	}
	
};

/*
Mif.Tree.Selection
*/
Mif.Tree.implement({
	
	initSelection: function(){
		this.defaults.selectClass='';
		this.wrapper.addEvent('mousedown', this.attachSelect.bindWithEvent(this));
	},
	
	attachSelect: function(event){
		if(!['icon', 'name', 'node'].contains(this.mouse.target)) return;
		var node=this.mouse.node;
		if(!node) return;
		this.select(node);
	},
	
	select: function(node, preventFocus) {
		if(!preventFocus && (Browser.Engine.gecko||Browser.Engine.webkit)) {
			this.wrapper.focus();
		}
		var current=this.selected;
		if (current==node) return this;
		if (current) {
			current.select(false);
			this.fireEvent('unSelect', [current]).fireEvent('selectChange', [current, false]);
		}
		this.selected = node;
		node.select(true);
		this.fireEvent('select', [node]).fireEvent('selectChange', [node, true]);
		return this;
	},
	
	unselect: function(){
		var current=this.selected;
		if(!current) return this;
		this.selected=false;
		current.select(false);
		this.fireEvent('unSelect', [current]).fireEvent('selectChange', [current, false]);
		return this;
	},
	
	getSelected: function(){
		return this.selected;
	},
	
	isSelected: function(node){
		return node.isSelected();
	}
	
});

Mif.Tree.Node.implement({
		
	select: function(state) {
		this.state.selected = state;
		var wrapper=this.getDOM('wrapper');
		wrapper[(state ? 'add' : 'remove')+'Class'](this.selectClass||'mif-tree-node-selected');
	},
	
	isSelected: function(){
		return this.state.selected;
	}
	
});
/*
Mif.Tree.Load
*/
Mif.Tree.Load={
		
	children: function(children, parent, tree){
		for( var i=children.length; i--; ){
			var child=children[i];
			var subChildren=child.children;
			delete child.children;
			var node=new Mif.Tree.Node({
				tree: tree,
				parentNode: parent||undefined
			}, child);
			if( tree.forest || parent != undefined){
				parent.children.unshift(node);
			}else{
				tree.root=node;
			}
			if(subChildren && subChildren.length){
				arguments.callee(subChildren, node, tree);
			}
		}
		if(parent) parent.state.loaded=true;
		tree.fireEvent('loadChildren', parent);
	}
	
};

Mif.Tree.implement({

	load: function(options){
		var tree=this;
		this.loadOptions=this.loadOptions||$lambda({});
		function success(json){
			if(tree.forest){
				tree.root=new Mif.Tree.Node({
					tree: tree,
					parentNode: null
				}, {});
				var parent=tree.root;
			}else{
				var parent=null;
			}
			Mif.Tree.Load.children(json, parent, tree);
			Mif.Tree.Draw[tree.forest ? 'forestRoot' : 'root'](tree);
			tree.$getIndex();
			tree.fireEvent('load');
			return tree;
		}
		options=$extend($extend({
			isSuccess: $lambda(true),
			secure: true,
			onSuccess: success,
			method: 'get'
		}, this.loadOptions()), options);
		if(options.json) return success(options.json);
		new Request.JSON(options).send();
		return this;
	}
	
});

Mif.Tree.Node.implement({
	
	load: function(options){
		this.$loading=true;
		options=options||{};
		this.addType('loader');
		var self=this;
		function success(json){
			Mif.Tree.Load.children(json, self, self.tree);
			delete self.$loading;
			self.state.loaded=true;
			self.removeType('loader');
			self.fireEvent('load');
			self.tree.fireEvent('loadNode', self);
			return self;
		}
		options=$extend($extend($extend({
			isSuccess: $lambda(true),
			secure: true,
			onSuccess: success,
			method: 'get'
		}, this.tree.loadOptions(this)), this.loadOptions), options);
		if(options.json) return success(options.json);
		new Request.JSON(options).send();
		return this;
	}
	
});
Mif.Tree.Draw={getHTML:function(b,a){var d=b.tree.DOMidPrefix;if($defined(b.state.checked)){if(!b.hasCheckbox){b.state.checked="nochecked"}var c='<span class="mif-tree-checkbox mif-tree-node-'+b.state.checked+'" uid="'+b.UID+'">'+Mif.Tree.Draw.zeroSpace+"</span>"}else{var c=""}a=a||[];a.push('<div class="mif-tree-node ',(b.isLast()?"mif-tree-node-last":""),'" id="',d,b.UID,'">','<span class="mif-tree-node-wrapper ',b.cls,'" uid="',b.UID,'">','<span class="mif-tree-gadjet mif-tree-gadjet-',b.getGadjetType(),'" uid="',b.UID,'">',Mif.Tree.Draw.zeroSpace,"</span>",c,'<span class="mif-tree-icon ',b.closeIcon,'" uid="',b.UID,'">',Mif.Tree.Draw.zeroSpace,"</span>",'<span class="mif-tree-name" uid="',b.UID,'">',b.name,"</span>","</span>",'<div class="mif-tree-children" style="display:none"></div>',"</div>");return a},children:function(f,b){f.open=true;f.$draw=true;var e=[];var d=f.children;for(var c=0,a=d.length;c<a;c++){this.getHTML(d[c],e)}b=b||f.getDOM("children");b.set("html",e.join(""));f.tree.fireEvent("drawChildren",[f])},root:function(b){var a=this.node(b.root);a.injectInside(b.wrapper);b.fireEvent("drawRoot")},forestRoot:function(a){var b=new Element("div").addClass("mif-tree-children-root").injectInside(a.wrapper);Mif.Tree.Draw.children(a.root,b)},node:function(a){return new Element("div").set("html",this.getHTML(a).join("")).getFirst()},update:function(b){if(!b){return}if((b.tree.forest&&b.isRoot())||(b.getParent()&&!b.getParent().$draw)){return}if(!b.hasChildren()){b.state.open=false}b.getDOM("name").set("html",b.name);b.getDOM("wrapper").className="mif-tree-node-wrapper "+b.cls;b.getDOM("gadjet").className="mif-tree-gadjet mif-tree-gadjet-"+b.getGadjetType();b.getDOM("icon").className="mif-tree-icon "+b[b.isOpen()?"openIcon":"closeIcon"];b.getDOM("node")[(b.isLast()?"add":"remove")+"Class"]("mif-tree-node-last");b.select(b.isSelected());b.tree.updateHover();if(b.$loading){return}var a=b.getDOM("children");a.className="mif-tree-children";if(b.isOpen()){if(!b.$draw){Mif.Tree.Draw.children(b)}a.style.display="block"}else{a.style.display="none"}b.tree.fireEvent("updateNode",b);return b},updateDOM:function(d,b){b=b||d.getDOM("node");var c=d.getPrevious();if(c){b.injectAfter(c.getDOM("node"))}else{if(d.tree.forest&&d.parentNode.isRoot()){var a=d.tree.wrapper.getElement(".mif-tree-children-root")}else{var a=d.parentNode.getDOM("children")}b.injectTop(a)}}};Mif.Tree.Draw.zeroSpace=Browser.Engine.trident?"&shy;":(Browser.Engine.webkit?"&#8203":"");