/*
	cssQuery, version 2.0.2 (2005-08-19)
	Copyright: 2004-2005, Dean Edwards (http://dean.edwards.name/)
	License: http://creativecommons.org/licenses/LGPL/2.1/
*/
eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('7 x=6(){7 1D="2.0.2";7 C=/\\s*,\\s*/;7 x=6(s,A){33{7 m=[];7 u=1z.32.2c&&!A;7 b=(A)?(A.31==22)?A:[A]:[1g];7 1E=18(s).1l(C),i;9(i=0;i<1E.y;i++){s=1y(1E[i]);8(U&&s.Z(0,3).2b("")==" *#"){s=s.Z(2);A=24([],b,s[1])}1A A=b;7 j=0,t,f,a,c="";H(j<s.y){t=s[j++];f=s[j++];c+=t+f;a="";8(s[j]=="("){H(s[j++]!=")")a+=s[j];a=a.Z(0,-1);c+="("+a+")"}A=(u&&V[c])?V[c]:21(A,t,f,a);8(u)V[c]=A}m=m.30(A)}2a x.2d;5 m}2Z(e){x.2d=e;5[]}};x.1Z=6(){5"6 x() {\\n  [1D "+1D+"]\\n}"};7 V={};x.2c=L;x.2Y=6(s){8(s){s=1y(s).2b("");2a V[s]}1A V={}};7 29={};7 19=L;x.15=6(n,s){8(19)1i("s="+1U(s));29[n]=12 s()};x.2X=6(c){5 c?1i(c):o};7 D={};7 h={};7 q={P:/\\[([\\w-]+(\\|[\\w-]+)?)\\s*(\\W?=)?\\s*([^\\]]*)\\]/};7 T=[];D[" "]=6(r,f,t,n){7 e,i,j;9(i=0;i<f.y;i++){7 s=X(f[i],t,n);9(j=0;(e=s[j]);j++){8(M(e)&&14(e,n))r.z(e)}}};D["#"]=6(r,f,i){7 e,j;9(j=0;(e=f[j]);j++)8(e.B==i)r.z(e)};D["."]=6(r,f,c){c=12 1t("(^|\\\\s)"+c+"(\\\\s|$)");7 e,i;9(i=0;(e=f[i]);i++)8(c.l(e.1V))r.z(e)};D[":"]=6(r,f,p,a){7 t=h[p],e,i;8(t)9(i=0;(e=f[i]);i++)8(t(e,a))r.z(e)};h["2W"]=6(e){7 d=Q(e);8(d.1C)9(7 i=0;i<d.1C.y;i++){8(d.1C[i]==e)5 K}};h["2V"]=6(e){};7 M=6(e){5(e&&e.1c==1&&e.1f!="!")?e:23};7 16=6(e){H(e&&(e=e.2U)&&!M(e))28;5 e};7 G=6(e){H(e&&(e=e.2T)&&!M(e))28;5 e};7 1r=6(e){5 M(e.27)||G(e.27)};7 1P=6(e){5 M(e.26)||16(e.26)};7 1o=6(e){7 c=[];e=1r(e);H(e){c.z(e);e=G(e)}5 c};7 U=K;7 1h=6(e){7 d=Q(e);5(2S d.25=="2R")?/\\.1J$/i.l(d.2Q):2P(d.25=="2O 2N")};7 Q=6(e){5 e.2M||e.1g};7 X=6(e,t){5(t=="*"&&e.1B)?e.1B:e.X(t)};7 17=6(e,t,n){8(t=="*")5 M(e);8(!14(e,n))5 L;8(!1h(e))t=t.2L();5 e.1f==t};7 14=6(e,n){5!n||(n=="*")||(e.2K==n)};7 1e=6(e){5 e.1G};6 24(r,f,B){7 m,i,j;9(i=0;i<f.y;i++){8(m=f[i].1B.2J(B)){8(m.B==B)r.z(m);1A 8(m.y!=23){9(j=0;j<m.y;j++){8(m[j].B==B)r.z(m[j])}}}}5 r};8(![].z)22.2I.z=6(){9(7 i=0;i<1z.y;i++){o[o.y]=1z[i]}5 o.y};7 N=/\\|/;6 21(A,t,f,a){8(N.l(f)){f=f.1l(N);a=f[0];f=f[1]}7 r=[];8(D[t]){D[t](r,A,f,a)}5 r};7 S=/^[^\\s>+~]/;7 20=/[\\s#.:>+~()@]|[^\\s#.:>+~()@]+/g;6 1y(s){8(S.l(s))s=" "+s;5 s.P(20)||[]};7 W=/\\s*([\\s>+~(),]|^|$)\\s*/g;7 I=/([\\s>+~,]|[^(]\\+|^)([#.:@])/g;7 18=6(s){5 s.O(W,"$1").O(I,"$1*$2")};7 1u={1Z:6(){5"\'"},P:/^(\'[^\']*\')|("[^"]*")$/,l:6(s){5 o.P.l(s)},1S:6(s){5 o.l(s)?s:o+s+o},1Y:6(s){5 o.l(s)?s.Z(1,-1):s}};7 1s=6(t){5 1u.1Y(t)};7 E=/([\\/()[\\]?{}|*+-])/g;6 R(s){5 s.O(E,"\\\\$1")};x.15("1j-2H",6(){D[">"]=6(r,f,t,n){7 e,i,j;9(i=0;i<f.y;i++){7 s=1o(f[i]);9(j=0;(e=s[j]);j++)8(17(e,t,n))r.z(e)}};D["+"]=6(r,f,t,n){9(7 i=0;i<f.y;i++){7 e=G(f[i]);8(e&&17(e,t,n))r.z(e)}};D["@"]=6(r,f,a){7 t=T[a].l;7 e,i;9(i=0;(e=f[i]);i++)8(t(e))r.z(e)};h["2G-10"]=6(e){5!16(e)};h["1x"]=6(e,c){c=12 1t("^"+c,"i");H(e&&!e.13("1x"))e=e.1n;5 e&&c.l(e.13("1x"))};q.1X=/\\\\:/g;q.1w="@";q.J={};q.O=6(m,a,n,c,v){7 k=o.1w+m;8(!T[k]){a=o.1W(a,c||"",v||"");T[k]=a;T.z(a)}5 T[k].B};q.1Q=6(s){s=s.O(o.1X,"|");7 m;H(m=s.P(o.P)){7 r=o.O(m[0],m[1],m[2],m[3],m[4]);s=s.O(o.P,r)}5 s};q.1W=6(p,t,v){7 a={};a.B=o.1w+T.y;a.2F=p;t=o.J[t];t=t?t(o.13(p),1s(v)):L;a.l=12 2E("e","5 "+t);5 a};q.13=6(n){1d(n.2D()){F"B":5"e.B";F"2C":5"e.1V";F"9":5"e.2B";F"1T":8(U){5"1U((e.2A.P(/1T=\\\\1v?([^\\\\s\\\\1v]*)\\\\1v?/)||[])[1]||\'\')"}}5"e.13(\'"+n.O(N,":")+"\')"};q.J[""]=6(a){5 a};q.J["="]=6(a,v){5 a+"=="+1u.1S(v)};q.J["~="]=6(a,v){5"/(^| )"+R(v)+"( |$)/.l("+a+")"};q.J["|="]=6(a,v){5"/^"+R(v)+"(-|$)/.l("+a+")"};7 1R=18;18=6(s){5 1R(q.1Q(s))}});x.15("1j-2z",6(){D["~"]=6(r,f,t,n){7 e,i;9(i=0;(e=f[i]);i++){H(e=G(e)){8(17(e,t,n))r.z(e)}}};h["2y"]=6(e,t){t=12 1t(R(1s(t)));5 t.l(1e(e))};h["2x"]=6(e){5 e==Q(e).1H};h["2w"]=6(e){7 n,i;9(i=0;(n=e.1F[i]);i++){8(M(n)||n.1c==3)5 L}5 K};h["1N-10"]=6(e){5!G(e)};h["2v-10"]=6(e){e=e.1n;5 1r(e)==1P(e)};h["2u"]=6(e,s){7 n=x(s,Q(e));9(7 i=0;i<n.y;i++){8(n[i]==e)5 L}5 K};h["1O-10"]=6(e,a){5 1p(e,a,16)};h["1O-1N-10"]=6(e,a){5 1p(e,a,G)};h["2t"]=6(e){5 e.B==2s.2r.Z(1)};h["1M"]=6(e){5 e.1M};h["2q"]=6(e){5 e.1q===L};h["1q"]=6(e){5 e.1q};h["1L"]=6(e){5 e.1L};q.J["^="]=6(a,v){5"/^"+R(v)+"/.l("+a+")"};q.J["$="]=6(a,v){5"/"+R(v)+"$/.l("+a+")"};q.J["*="]=6(a,v){5"/"+R(v)+"/.l("+a+")"};6 1p(e,a,t){1d(a){F"n":5 K;F"2p":a="2n";1a;F"2o":a="2n+1"}7 1m=1o(e.1n);6 1k(i){7 i=(t==G)?1m.y-i:i-1;5 1m[i]==e};8(!Y(a))5 1k(a);a=a.1l("n");7 m=1K(a[0]);7 s=1K(a[1]);8((Y(m)||m==1)&&s==0)5 K;8(m==0&&!Y(s))5 1k(s);8(Y(s))s=0;7 c=1;H(e=t(e))c++;8(Y(m)||m==1)5(t==G)?(c<=s):(s>=c);5(c%m)==s}});x.15("1j-2m",6(){U=1i("L;/*@2l@8(@\\2k)U=K@2j@*/");8(!U){X=6(e,t,n){5 n?e.2i("*",t):e.X(t)};14=6(e,n){5!n||(n=="*")||(e.2h==n)};1h=1g.1I?6(e){5/1J/i.l(Q(e).1I)}:6(e){5 Q(e).1H.1f!="2g"};1e=6(e){5 e.2f||e.1G||1b(e)};6 1b(e){7 t="",n,i;9(i=0;(n=e.1F[i]);i++){1d(n.1c){F 11:F 1:t+=1b(n);1a;F 3:t+=n.2e;1a}}5 t}}});19=K;5 x}();',62,190,'|||||return|function|var|if|for||||||||pseudoClasses||||test|||this||AttributeSelector|||||||cssQuery|length|push|fr|id||selectors||case|nextElementSibling|while||tests|true|false|thisElement||replace|match|getDocument|regEscape||attributeSelectors|isMSIE|cache||getElementsByTagName|isNaN|slice|child||new|getAttribute|compareNamespace|addModule|previousElementSibling|compareTagName|parseSelector|loaded|break|_0|nodeType|switch|getTextContent|tagName|document|isXML|eval|css|_1|split|ch|parentNode|childElements|nthChild|disabled|firstElementChild|getText|RegExp|Quote|x22|PREFIX|lang|_2|arguments|else|all|links|version|se|childNodes|innerText|documentElement|contentType|xml|parseInt|indeterminate|checked|last|nth|lastElementChild|parse|_3|add|href|String|className|create|NS_IE|remove|toString|ST|select|Array|null|_4|mimeType|lastChild|firstChild|continue|modules|delete|join|caching|error|nodeValue|textContent|HTML|prefix|getElementsByTagNameNS|end|x5fwin32|cc_on|standard||odd|even|enabled|hash|location|target|not|only|empty|root|contains|level3|outerHTML|htmlFor|class|toLowerCase|Function|name|first|level2|prototype|item|scopeName|toUpperCase|ownerDocument|Document|XML|Boolean|URL|unknown|typeof|nextSibling|previousSibling|visited|link|valueOf|clearCache|catch|concat|constructor|callee|try'.split('|'),0,{}))

document.write('<style type="text/css">[draggable=true] {-khtml-user-drag: element; -webkit-user-drag: element; -khtml-user-select: none; -webkit-user-select: none;}</style>');


/*******************************************************************************
 * This notice must be untouched at all times.
 * 
 * This javascript library contains helper routines to assist HTML5 Drag and 
 * Drop behave consinstantly among browsers
 * 
 * DragDropHelpers.js v.1.0 available at http://www.useragentman.com/
 * 
 * released under the LGPL 2.1 (http://creativecommons.org/licenses/LGPL/2.1/)
*******************************************************************************/
var DragDropHelpers = new function () {
	var me = this;
	
	var draggableNodes; 
	
	var dragEffectNode;
	
	var currentlyDragged;
	
	var cachedShowVisualCues = null;
	
	/*
	 * If set to true, this will show a draggable visual cue in IE and Chrome.
	 */
	me.fixVisualCues = false;	
	
	/*
	 * If set to true, this will show the "move" cursor when the mouse pointer
	 * hovers over a draggable node.
	 */
	me.showMouseoverCue = true;
	
	
	/*
	 * Run when the page is loaded.  
	 */
	me.init = function () {
		if (EventHelpers.hasPageLoadHappened(arguments)) {
			return;
		}
		
		setEvents();	
	}
	
	
	function setEvents() {
		draggableNodes = cssQuery('[draggable=true]');
		
		
		if (draggableNodes.length > 0) {
			for (var i = 0; i < draggableNodes.length; i++) {
				var draggableNode = draggableNodes[i];
				
				/*
				 * This block allows IE to drag any arbitrary object, 
				 * not just links and images.
				 */
				if (draggableNode.dragDrop) {
					EventHelpers.addEvent(draggableNode, 'mousemove', 
					   draggableNodeMousemoveEvent);
				}
				
				/*
				 * When the mouse pointer hovers over the draggable objects,
				 * it changes to the move icon. 
				 */
				if (DragDropHelpers.showMouseoverCue) {
					draggableNode.style.cursor = 'move';
				}
				
				/*
				 * This sets up events that will give visual cues in IE and 
				 * Chrome.  On dragstart, it will clone the draggable object 
				 * and make it transpararent.  On dragend, it will destroy 
				 * it.      
				 */
				if (me.fixVisualCues) {
					EventHelpers.addEvent(draggableNode, 'dragstart', dragStartEvent);
					EventHelpers.addEvent(draggableNode, 'dragend', dragEndEvent)
				}
			}
		}
		
		/*
		 * This sets up an event that will move the cloned draggable object
		 * when the object is being dragged.
		 */
		if (me.fixVisualCues) {
			EventHelpers.addEvent(document.body, 'drag', dragEvent);
		}
		
	}
	
	
	
	function dragStartEvent(e) {
		if (!doesShowVisualCues(e)) {
			dragEffectNode = this.cloneNode(true);
			
			document.body.appendChild(dragEffectNode);
			dragEffectNode.style.position = 'absolute';
			dragEffectNode.style.visibility = 'hidden';
			CSSHelpers.setOpacity(dragEffectNode, 50);
			
			currentlyDragged = this;
		}
	}
	
	function dragEvent(e) {
		if (!doesShowVisualCues(e)) {
			var nodeLeft = CSSHelpers.getAbsoluteLeft(currentlyDragged);
			var nodeTop = CSSHelpers.getAbsoluteTop(currentlyDragged)
			dragEffectNode.style.visibility = 'visible';
			dragEffectNode.style.left = (e.offsetX + nodeLeft) + 'px';
			dragEffectNode.style.top = (e.offsetY + nodeTop + 5) + 'px';
		}
	}
	
	function dragEndEvent(e) {
		if (!doesShowVisualCues(e)) {
			document.body.removeChild(dragEffectNode);
		}
	}
	
	/*
	 * figures out if a visual cue needs to be inserted.   
	 */
	function doesShowVisualCues(e) {
		
		if (cachedShowVisualCues == null) {
			
			if (e.dataTransfer.setDragImage) {
				var chromeString = navigator.userAgent.match(/Chrome\/[0-9]\.[0-9]/);
				
				if (chromeString) {
				
					var info = chromeString[0].split('/');
					
					if (parseFloat(info[1]) < 5) {
						cachedShowVisualCues =  false;
					}
					else {
						cachedShowVisualCues = true;
					}
				}
				else {
					cachedShowVisualCues = true;
				}
				
			}
			else {
				cachedShowVisualCues = false;
			}
		}
		return cachedShowVisualCues;
	}


	
	
	function draggableNodeMousemoveEvent(e) {
		
		var node = EventHelpers.getEventTarget(e);
		if (window.event.button == 1) {
		    node.dragDrop();
		}
	}
	
	
	
	me.getEventCoords = function (e) {
		var r;
		
		if (e.offsetX) {
			r = {
				x: e.offsetX,
				y: e.offsetY
			}
		} else if (e.layerX) {
			
			r =  {
				x: e.layerX,
				y: e.layerY
			}
			
			
			
		} else {
			r = null;
		}
		
		return r;
	}
	

	/* 
	 * Idea for randomString() from 
	 * http://www.mediacollege.com/internet/javascript/number/random.html
	 */
	me.randomString = function () {
		var chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz";
		var string_length = 8;
		var randomstring = '';
		for (var i=0; i<string_length; i++) {
			var rnum = Math.floor(Math.random() * chars.length);
			randomstring += chars.substring(rnum,rnum+1);
		}
		return randomstring;
	}
	
	
}


var CSSHelpers = new function(e){
	var me = this;
	
	/**
	 * Sets the opacity percentage of an HTML object.  It is not advised to set 
	 * the opacity of an object whose parent's opacity has also been set.
	 *
	 */
	me.setOpacity = function(obj, percentage){
		if (obj.style.filter != null) {
			// IE must have layout, see 
			// http://jszen.blogspot.com/2005/04/ie6-opacity-filter-caveat.html
			// for details.
			obj.style.zoom = "100%";
			
			// if percentage is 100, set this property to nothing.  THis
			// is to prevent selects within this container from disappearing
			// as described in 
			// http://www.esqsoft.com/documents/problem-select-input-disappears-in-IE.htm
			if (percentage == 100) {
				obj.style.filter = "";
			}
			else {
				obj.style.filter = 'alpha(opacity=' + percentage.toString() + ')';
			}
		}
		// W3C 
		else 
			if (obj.style.opacity != null) {
				obj.style.opacity = (percentage / 100).toString();
			// Mozilla
			}
			else 
				if (obj.style.MozOpacity != null) {
					obj.style.MozOpacity = (percentage / 100).toString();
					
				}
		
	}
	
	me.getAbsoluteLeft = function(obj) {
		var curleft = obj.offsetLeft;
		if (obj.offsetParent) {

			while (obj = obj.offsetParent ) {
				curleft += obj.offsetLeft - obj.scrollLeft;
			}
		}
		return curleft;
	}
	
	
	
	me.getAbsoluteTop = function(node) {
		var obj = node;
		var positionArray = new Array();
		
		
		var curtop = obj.offsetTop;
		if (obj.offsetParent) {

			while (obj = obj.offsetParent) {
					curtop += obj.offsetTop - obj.scrollTop;				
			}
		}
		
		
		return curtop;
	}
	
	
}

EventHelpers.addPageLoadEvent('DragDropHelpers.init');
