/* mootools12.js start *///MooTools, <http://mootools.net>, My Object Oriented (JavaScript) Tools. Copyright (c) 2006-2008 Valerio Proietti, <http://mad4milk.net>, MIT Style License.

var MooTools={version:"1.2.0",build:""};var Native=function(J){J=J||{};var F=J.afterImplement||function(){};var G=J.generics;G=(G!==false);var H=J.legacy;
var E=J.initialize;var B=J.protect;var A=J.name;var C=E||H;C.constructor=Native;C.$family={name:"native"};if(H&&E){C.prototype=H.prototype;}C.prototype.constructor=C;
if(A){var D=A.toLowerCase();C.prototype.$family={name:D};Native.typize(C,D);}var I=function(M,K,N,L){if(!B||L||!M.prototype[K]){M.prototype[K]=N;}if(G){Native.genericize(M,K,B);
}F.call(M,K,N);return M;};C.implement=function(L,K,N){if(typeof L=="string"){return I(this,L,K,N);}for(var M in L){I(this,M,L[M],K);}return this;};C.alias=function(M,K,N){if(typeof M=="string"){M=this.prototype[M];
if(M){I(this,K,M,N);}}else{for(var L in M){this.alias(L,M[L],K);}}return this;};return C;};Native.implement=function(D,C){for(var B=0,A=D.length;B<A;B++){D[B].implement(C);
}};Native.genericize=function(B,C,A){if((!A||!B[C])&&typeof B.prototype[C]=="function"){B[C]=function(){var D=Array.prototype.slice.call(arguments);return B.prototype[C].apply(D.shift(),D);
};}};Native.typize=function(A,B){if(!A.type){A.type=function(C){return($type(C)===B);};}};Native.alias=function(E,B,A,F){for(var D=0,C=E.length;D<C;D++){E[D].alias(B,A,F);
}};(function(B){for(var A in B){Native.typize(B[A],A);}})({"boolean":Boolean,"native":Native,object:Object});(function(B){for(var A in B){new Native({name:A,initialize:B[A],protect:true});
}})({String:String,Function:Function,Number:Number,Array:Array,RegExp:RegExp,Date:Date});(function(B,A){for(var C=A.length;C--;C){Native.genericize(B,A[C],true);
}return arguments.callee;})(Array,["pop","push","reverse","shift","sort","splice","unshift","concat","join","slice","toString","valueOf","indexOf","lastIndexOf"])(String,["charAt","charCodeAt","concat","indexOf","lastIndexOf","match","replace","search","slice","split","substr","substring","toLowerCase","toUpperCase","valueOf"]);
function $chk(A){return !!(A||A===0);}function $clear(A){clearTimeout(A);clearInterval(A);return null;}function $defined(A){return(A!=undefined);}function $empty(){}function $arguments(A){return function(){return arguments[A];
};}function $lambda(A){return(typeof A=="function")?A:function(){return A;};}function $extend(C,A){for(var B in (A||{})){C[B]=A[B];}return C;}function $unlink(C){var B;
switch($type(C)){case"object":B={};for(var E in C){B[E]=$unlink(C[E]);}break;case"hash":B=$unlink(C.getClean());break;case"array":B=[];for(var D=0,A=C.length;
D<A;D++){B[D]=$unlink(C[D]);}break;default:return C;}return B;}function $merge(){var E={};for(var D=0,A=arguments.length;D<A;D++){var B=arguments[D];if($type(B)!="object"){continue;
}for(var C in B){var G=B[C],F=E[C];E[C]=(F&&$type(G)=="object"&&$type(F)=="object")?$merge(F,G):$unlink(G);}}return E;}function $pick(){for(var B=0,A=arguments.length;
B<A;B++){if(arguments[B]!=undefined){return arguments[B];}}return null;}function $random(B,A){return Math.floor(Math.random()*(A-B+1)+B);}function $splat(B){var A=$type(B);
return(A)?((A!="array"&&A!="arguments")?[B]:B):[];}var $time=Date.now||function(){return new Date().getTime();};function $try(){for(var B=0,A=arguments.length;
B<A;B++){try{return arguments[B]();}catch(C){}}return null;}function $type(A){if(A==undefined){return false;}if(A.$family){return(A.$family.name=="number"&&!isFinite(A))?false:A.$family.name;
}if(A.nodeName){switch(A.nodeType){case 1:return"element";case 3:return(/\S/).test(A.nodeValue)?"textnode":"whitespace";}}else{if(typeof A.length=="number"){if(A.callee){return"arguments";
}else{if(A.item){return"collection";}}}}return typeof A;}var Hash=new Native({name:"Hash",initialize:function(A){if($type(A)=="hash"){A=$unlink(A.getClean());
}for(var B in A){this[B]=A[B];}return this;}});Hash.implement({getLength:function(){var B=0;for(var A in this){if(this.hasOwnProperty(A)){B++;}}return B;
},forEach:function(B,C){for(var A in this){if(this.hasOwnProperty(A)){B.call(C,this[A],A,this);}}},getClean:function(){var B={};for(var A in this){if(this.hasOwnProperty(A)){B[A]=this[A];
}}return B;}});Hash.alias("forEach","each");function $H(A){return new Hash(A);}Array.implement({forEach:function(C,D){for(var B=0,A=this.length;B<A;B++){C.call(D,this[B],B,this);
}}});Array.alias("forEach","each");function $A(C){if(C.item){var D=[];for(var B=0,A=C.length;B<A;B++){D[B]=C[B];}return D;}return Array.prototype.slice.call(C);
}function $each(C,B,D){var A=$type(C);((A=="arguments"||A=="collection"||A=="array")?Array:Hash).each(C,B,D);}var Browser=new Hash({Engine:{name:"unknown",version:""},Platform:{name:(navigator.platform.match(/mac|win|linux/i)||["other"])[0].toLowerCase()},Features:{xpath:!!(document.evaluate),air:!!(window.runtime)},Plugins:{}});
if(window.opera){Browser.Engine={name:"presto",version:(document.getElementsByClassName)?950:925};}else{if(window.ActiveXObject){Browser.Engine={name:"trident",version:(window.XMLHttpRequest)?5:4};
}else{if(!navigator.taintEnabled){Browser.Engine={name:"webkit",version:(Browser.Features.xpath)?420:419};}else{if(document.getBoxObjectFor!=null){Browser.Engine={name:"gecko",version:(document.getElementsByClassName)?19:18};
}}}}Browser.Engine[Browser.Engine.name]=Browser.Engine[Browser.Engine.name+Browser.Engine.version]=true;if(window.orientation!=undefined){Browser.Platform.name="ipod";
}Browser.Platform[Browser.Platform.name]=true;Browser.Request=function(){return $try(function(){return new XMLHttpRequest();},function(){return new ActiveXObject("MSXML2.XMLHTTP");
});};Browser.Features.xhr=!!(Browser.Request());Browser.Plugins.Flash=(function(){var A=($try(function(){return navigator.plugins["Shockwave Flash"].description;
},function(){return new ActiveXObject("ShockwaveFlash.ShockwaveFlash").GetVariable("$version");})||"0 r0").match(/\d+/g);return{version:parseInt(A[0]||0+"."+A[1]||0),build:parseInt(A[2]||0)};
})();function $exec(B){if(!B){return B;}if(window.execScript){window.execScript(B);}else{var A=document.createElement("script");A.setAttribute("type","text/javascript");
A.text=B;document.head.appendChild(A);document.head.removeChild(A);}return B;}Native.UID=1;var $uid=(Browser.Engine.trident)?function(A){return(A.uid||(A.uid=[Native.UID++]))[0];
}:function(A){return A.uid||(A.uid=Native.UID++);};var Window=new Native({name:"Window",legacy:(Browser.Engine.trident)?null:window.Window,initialize:function(A){$uid(A);
if(!A.Element){A.Element=$empty;if(Browser.Engine.webkit){A.document.createElement("iframe");}A.Element.prototype=(Browser.Engine.webkit)?window["[[DOMElement.prototype]]"]:{};
}return $extend(A,Window.Prototype);},afterImplement:function(B,A){window[B]=Window.Prototype[B]=A;}});Window.Prototype={$family:{name:"window"}};new Window(window);
var Document=new Native({name:"Document",legacy:(Browser.Engine.trident)?null:window.Document,initialize:function(A){$uid(A);A.head=A.getElementsByTagName("head")[0];
A.html=A.getElementsByTagName("html")[0];A.window=A.defaultView||A.parentWindow;if(Browser.Engine.trident4){$try(function(){A.execCommand("BackgroundImageCache",false,true);
});}return $extend(A,Document.Prototype);},afterImplement:function(B,A){document[B]=Document.Prototype[B]=A;}});Document.Prototype={$family:{name:"document"}};
new Document(document);Array.implement({every:function(C,D){for(var B=0,A=this.length;B<A;B++){if(!C.call(D,this[B],B,this)){return false;}}return true;
},filter:function(D,E){var C=[];for(var B=0,A=this.length;B<A;B++){if(D.call(E,this[B],B,this)){C.push(this[B]);}}return C;},clean:function(){return this.filter($defined);
},indexOf:function(C,D){var A=this.length;for(var B=(D<0)?Math.max(0,A+D):D||0;B<A;B++){if(this[B]===C){return B;}}return -1;},map:function(D,E){var C=[];
for(var B=0,A=this.length;B<A;B++){C[B]=D.call(E,this[B],B,this);}return C;},some:function(C,D){for(var B=0,A=this.length;B<A;B++){if(C.call(D,this[B],B,this)){return true;
}}return false;},associate:function(C){var D={},B=Math.min(this.length,C.length);for(var A=0;A<B;A++){D[C[A]]=this[A];}return D;},link:function(C){var A={};
for(var E=0,B=this.length;E<B;E++){for(var D in C){if(C[D](this[E])){A[D]=this[E];delete C[D];break;}}}return A;},contains:function(A,B){return this.indexOf(A,B)!=-1;
},extend:function(C){for(var B=0,A=C.length;B<A;B++){this.push(C[B]);}return this;},getLast:function(){return(this.length)?this[this.length-1]:null;},getRandom:function(){return(this.length)?this[$random(0,this.length-1)]:null;
},include:function(A){if(!this.contains(A)){this.push(A);}return this;},combine:function(C){for(var B=0,A=C.length;B<A;B++){this.include(C[B]);}return this;
},erase:function(B){for(var A=this.length;A--;A){if(this[A]===B){this.splice(A,1);}}return this;},empty:function(){this.length=0;return this;},flatten:function(){var D=[];
for(var B=0,A=this.length;B<A;B++){var C=$type(this[B]);if(!C){continue;}D=D.concat((C=="array"||C=="collection"||C=="arguments")?Array.flatten(this[B]):this[B]);
}return D;},hexToRgb:function(B){if(this.length!=3){return null;}var A=this.map(function(C){if(C.length==1){C+=C;}return C.toInt(16);});return(B)?A:"rgb("+A+")";
},rgbToHex:function(D){if(this.length<3){return null;}if(this.length==4&&this[3]==0&&!D){return"transparent";}var B=[];for(var A=0;A<3;A++){var C=(this[A]-0).toString(16);
B.push((C.length==1)?"0"+C:C);}return(D)?B:"#"+B.join("");}});Function.implement({extend:function(A){for(var B in A){this[B]=A[B];}return this;},create:function(B){var A=this;
B=B||{};return function(D){var C=B.arguments;C=(C!=undefined)?$splat(C):Array.slice(arguments,(B.event)?1:0);if(B.event){C=[D||window.event].extend(C);
}var E=function(){return A.apply(B.bind||null,C);};if(B.delay){return setTimeout(E,B.delay);}if(B.periodical){return setInterval(E,B.periodical);}if(B.attempt){return $try(E);
}return E();};},pass:function(A,B){return this.create({arguments:A,bind:B});},attempt:function(A,B){return this.create({arguments:A,bind:B,attempt:true})();
},bind:function(B,A){return this.create({bind:B,arguments:A});},bindWithEvent:function(B,A){return this.create({bind:B,event:true,arguments:A});},delay:function(B,C,A){return this.create({delay:B,bind:C,arguments:A})();
},periodical:function(A,C,B){return this.create({periodical:A,bind:C,arguments:B})();},run:function(A,B){return this.apply(B,$splat(A));}});Number.implement({limit:function(B,A){return Math.min(A,Math.max(B,this));
},round:function(A){A=Math.pow(10,A||0);return Math.round(this*A)/A;},times:function(B,C){for(var A=0;A<this;A++){B.call(C,A,this);}},toFloat:function(){return parseFloat(this);
},toInt:function(A){return parseInt(this,A||10);}});Number.alias("times","each");(function(B){var A={};B.each(function(C){if(!Number[C]){A[C]=function(){return Math[C].apply(null,[this].concat($A(arguments)));
};}});Number.implement(A);})(["abs","acos","asin","atan","atan2","ceil","cos","exp","floor","log","max","min","pow","sin","sqrt","tan"]);String.implement({test:function(A,B){return((typeof A=="string")?new RegExp(A,B):A).test(this);
},contains:function(A,B){return(B)?(B+this+B).indexOf(B+A+B)>-1:this.indexOf(A)>-1;},trim:function(){return this.replace(/^\s+|\s+$/g,"");},clean:function(){return this.replace(/\s+/g," ").trim();
},camelCase:function(){return this.replace(/-\D/g,function(A){return A.charAt(1).toUpperCase();});},hyphenate:function(){return this.replace(/[A-Z]/g,function(A){return("-"+A.charAt(0).toLowerCase());
});},capitalize:function(){return this.replace(/\b[a-z]/g,function(A){return A.toUpperCase();});},escapeRegExp:function(){return this.replace(/([-.*+?^${}()|[\]\/\\])/g,"\\$1");
},toInt:function(A){return parseInt(this,A||10);},toFloat:function(){return parseFloat(this);},hexToRgb:function(B){var A=this.match(/^#?(\w{1,2})(\w{1,2})(\w{1,2})$/);
return(A)?A.slice(1).hexToRgb(B):null;},rgbToHex:function(B){var A=this.match(/\d{1,3}/g);return(A)?A.rgbToHex(B):null;},stripScripts:function(B){var A="";
var C=this.replace(/<script[^>]*>([\s\S]*?)<\/script>/gi,function(){A+=arguments[1]+"\n";return"";});if(B===true){$exec(A);}else{if($type(B)=="function"){B(A,C);
}}return C;},substitute:function(A,B){return this.replace(B||(/\\?\{([^}]+)\}/g),function(D,C){if(D.charAt(0)=="\\"){return D.slice(1);}return(A[C]!=undefined)?A[C]:"";
});}});Hash.implement({has:Object.prototype.hasOwnProperty,keyOf:function(B){for(var A in this){if(this.hasOwnProperty(A)&&this[A]===B){return A;}}return null;
},hasValue:function(A){return(Hash.keyOf(this,A)!==null);},extend:function(A){Hash.each(A,function(C,B){Hash.set(this,B,C);},this);return this;},combine:function(A){Hash.each(A,function(C,B){Hash.include(this,B,C);
},this);return this;},erase:function(A){if(this.hasOwnProperty(A)){delete this[A];}return this;},get:function(A){return(this.hasOwnProperty(A))?this[A]:null;
},set:function(A,B){if(!this[A]||this.hasOwnProperty(A)){this[A]=B;}return this;},empty:function(){Hash.each(this,function(B,A){delete this[A];},this);
return this;},include:function(B,C){var A=this[B];if(A==undefined){this[B]=C;}return this;},map:function(B,C){var A=new Hash;Hash.each(this,function(E,D){A.set(D,B.call(C,E,D,this));
},this);return A;},filter:function(B,C){var A=new Hash;Hash.each(this,function(E,D){if(B.call(C,E,D,this)){A.set(D,E);}},this);return A;},every:function(B,C){for(var A in this){if(this.hasOwnProperty(A)&&!B.call(C,this[A],A)){return false;
}}return true;},some:function(B,C){for(var A in this){if(this.hasOwnProperty(A)&&B.call(C,this[A],A)){return true;}}return false;},getKeys:function(){var A=[];
Hash.each(this,function(C,B){A.push(B);});return A;},getValues:function(){var A=[];Hash.each(this,function(B){A.push(B);});return A;},toQueryString:function(A){var B=[];
Hash.each(this,function(F,E){if(A){E=A+"["+E+"]";}var D;switch($type(F)){case"object":D=Hash.toQueryString(F,E);break;case"array":var C={};F.each(function(H,G){C[G]=H;
});D=Hash.toQueryString(C,E);break;default:D=E+"="+encodeURIComponent(F);}if(F!=undefined){B.push(D);}});return B.join("&");}});Hash.alias({keyOf:"indexOf",hasValue:"contains"});
var Event=new Native({name:"Event",initialize:function(A,F){F=F||window;var K=F.document;A=A||F.event;if(A.$extended){return A;}this.$extended=true;var J=A.type;
var G=A.target||A.srcElement;while(G&&G.nodeType==3){G=G.parentNode;}if(J.test(/key/)){var B=A.which||A.keyCode;var M=Event.Keys.keyOf(B);if(J=="keydown"){var D=B-111;
if(D>0&&D<13){M="f"+D;}}M=M||String.fromCharCode(B).toLowerCase();}else{if(J.match(/(click|mouse|menu)/i)){K=(!K.compatMode||K.compatMode=="CSS1Compat")?K.html:K.body;
var I={x:A.pageX||A.clientX+K.scrollLeft,y:A.pageY||A.clientY+K.scrollTop};var C={x:(A.pageX)?A.pageX-F.pageXOffset:A.clientX,y:(A.pageY)?A.pageY-F.pageYOffset:A.clientY};
if(J.match(/DOMMouseScroll|mousewheel/)){var H=(A.wheelDelta)?A.wheelDelta/120:-(A.detail||0)/3;}var E=(A.which==3)||(A.button==2);var L=null;if(J.match(/over|out/)){switch(J){case"mouseover":L=A.relatedTarget||A.fromElement;
break;case"mouseout":L=A.relatedTarget||A.toElement;}if(!(function(){while(L&&L.nodeType==3){L=L.parentNode;}return true;}).create({attempt:Browser.Engine.gecko})()){L=false;
}}}}return $extend(this,{event:A,type:J,page:I,client:C,rightClick:E,wheel:H,relatedTarget:L,target:G,code:B,key:M,shift:A.shiftKey,control:A.ctrlKey,alt:A.altKey,meta:A.metaKey});
}});Event.Keys=new Hash({enter:13,up:38,down:40,left:37,right:39,esc:27,space:32,backspace:8,tab:9,"delete":46});Event.implement({stop:function(){return this.stopPropagation().preventDefault();
},stopPropagation:function(){if(this.event.stopPropagation){this.event.stopPropagation();}else{this.event.cancelBubble=true;}return this;},preventDefault:function(){if(this.event.preventDefault){this.event.preventDefault();
}else{this.event.returnValue=false;}return this;}});var Class=new Native({name:"Class",initialize:function(B){B=B||{};var A=function(E){for(var D in this){this[D]=$unlink(this[D]);
}for(var F in Class.Mutators){if(!this[F]){continue;}Class.Mutators[F](this,this[F]);delete this[F];}this.constructor=A;if(E===$empty){return this;}var C=(this.initialize)?this.initialize.apply(this,arguments):this;
if(this.options&&this.options.initialize){this.options.initialize.call(this);}return C;};$extend(A,this);A.constructor=Class;A.prototype=B;return A;}});
Class.implement({implement:function(){Class.Mutators.Implements(this.prototype,Array.slice(arguments));return this;}});Class.Mutators={Implements:function(A,B){$splat(B).each(function(C){$extend(A,($type(C)=="class")?new C($empty):C);
});},Extends:function(self,klass){var instance=new klass($empty);delete instance.parent;delete instance.parentOf;for(var key in instance){var current=self[key],previous=instance[key];
if(current==undefined){self[key]=previous;continue;}var ctype=$type(current),ptype=$type(previous);if(ctype!=ptype){continue;}switch(ctype){case"function":if(!arguments.callee.caller){self[key]=eval("("+String(current).replace(/\bthis\.parent\(\s*(\))?/g,function(full,close){return"arguments.callee._parent_.call(this"+(close||", ");
})+")");}self[key]._parent_=previous;break;case"object":self[key]=$merge(previous,current);}}self.parent=function(){return arguments.callee.caller._parent_.apply(this,arguments);
};self.parentOf=function(descendant){return descendant._parent_.apply(this,Array.slice(arguments,1));};}};var Chain=new Class({chain:function(){this.$chain=(this.$chain||[]).extend(arguments);
return this;},callChain:function(){return(this.$chain&&this.$chain.length)?this.$chain.shift().apply(this,arguments):false;},clearChain:function(){if(this.$chain){this.$chain.empty();
}return this;}});var Events=new Class({addEvent:function(C,B,A){C=Events.removeOn(C);if(B!=$empty){this.$events=this.$events||{};this.$events[C]=this.$events[C]||[];
this.$events[C].include(B);if(A){B.internal=true;}}return this;},addEvents:function(A){for(var B in A){this.addEvent(B,A[B]);}return this;},fireEvent:function(C,B,A){C=Events.removeOn(C);
if(!this.$events||!this.$events[C]){return this;}this.$events[C].each(function(D){D.create({bind:this,delay:A,"arguments":B})();},this);return this;},removeEvent:function(B,A){B=Events.removeOn(B);
if(!this.$events||!this.$events[B]){return this;}if(!A.internal){this.$events[B].erase(A);}return this;},removeEvents:function(C){for(var D in this.$events){if(C&&C!=D){continue;
}var B=this.$events[D];for(var A=B.length;A--;A){this.removeEvent(D,B[A]);}}return this;}});Events.removeOn=function(A){return A.replace(/^on([A-Z])/,function(B,C){return C.toLowerCase();
});};var Options=new Class({setOptions:function(){this.options=$merge.run([this.options].extend(arguments));if(!this.addEvent){return this;}for(var A in this.options){if($type(this.options[A])!="function"||!(/^on[A-Z]/).test(A)){continue;
}this.addEvent(A,this.options[A]);delete this.options[A];}return this;}});Document.implement({newElement:function(A,B){if(Browser.Engine.trident&&B){["name","type","checked"].each(function(C){if(!B[C]){return ;
}A+=" "+C+'="'+B[C]+'"';if(C!="checked"){delete B[C];}});A="<"+A+">";}return $.element(this.createElement(A)).set(B);},newTextNode:function(A){return this.createTextNode(A);
},getDocument:function(){return this;},getWindow:function(){return this.defaultView||this.parentWindow;},purge:function(){var C=this.getElementsByTagName("*");
for(var B=0,A=C.length;B<A;B++){Browser.freeMem(C[B]);}}});var Element=new Native({name:"Element",legacy:window.Element,initialize:function(A,B){var C=Element.Constructors.get(A);
if(C){return C(B);}if(typeof A=="string"){return document.newElement(A,B);}return $(A).set(B);},afterImplement:function(A,B){if(!Array[A]){Elements.implement(A,Elements.multi(A));
}Element.Prototype[A]=B;}});Element.Prototype={$family:{name:"element"}};Element.Constructors=new Hash;var IFrame=new Native({name:"IFrame",generics:false,initialize:function(){var E=Array.link(arguments,{properties:Object.type,iframe:$defined});
var C=E.properties||{};var B=$(E.iframe)||false;var D=C.onload||$empty;delete C.onload;C.id=C.name=$pick(C.id,C.name,B.id,B.name,"IFrame_"+$time());B=new Element(B||"iframe",C);
var A=function(){var F=$try(function(){return B.contentWindow.location.host;});if(F&&F==window.location.host){var H=new Window(B.contentWindow);var G=new Document(B.contentWindow.document);
$extend(H.Element.prototype,Element.Prototype);}D.call(B.contentWindow,B.contentWindow.document);};(!window.frames[C.id])?B.addListener("load",A):A();return B;
}});var Elements=new Native({initialize:function(F,B){B=$extend({ddup:true,cash:true},B);F=F||[];if(B.ddup||B.cash){var G={},E=[];for(var C=0,A=F.length;
C<A;C++){var D=$.element(F[C],!B.cash);if(B.ddup){if(G[D.uid]){continue;}G[D.uid]=true;}E.push(D);}F=E;}return(B.cash)?$extend(F,this):F;}});Elements.implement({filter:function(A,B){if(!A){return this;
}return new Elements(Array.filter(this,(typeof A=="string")?function(C){return C.match(A);}:A,B));}});Elements.multi=function(A){return function(){var B=[];
var F=true;for(var D=0,C=this.length;D<C;D++){var E=this[D][A].apply(this[D],arguments);B.push(E);if(F){F=($type(E)=="element");}}return(F)?new Elements(B):B;
};};Window.implement({$:function(B,C){if(B&&B.$family&&B.uid){return B;}var A=$type(B);return($[A])?$[A](B,C,this.document):null;},$$:function(A){if(arguments.length==1&&typeof A=="string"){return this.document.getElements(A);
}var F=[];var C=Array.flatten(arguments);for(var D=0,B=C.length;D<B;D++){var E=C[D];switch($type(E)){case"element":E=[E];break;case"string":E=this.document.getElements(E,true);
break;default:E=false;}if(E){F.extend(E);}}return new Elements(F);},getDocument:function(){return this.document;},getWindow:function(){return this;}});
$.string=function(C,B,A){C=A.getElementById(C);return(C)?$.element(C,B):null;};$.element=function(A,D){$uid(A);if(!D&&!A.$family&&!(/^object|embed$/i).test(A.tagName)){var B=Element.Prototype;
for(var C in B){A[C]=B[C];}}return A;};$.object=function(B,C,A){if(B.toElement){return $.element(B.toElement(A),C);}return null;};$.textnode=$.whitespace=$.window=$.document=$arguments(0);
Native.implement([Element,Document],{getElement:function(A,B){return $(this.getElements(A,true)[0]||null,B);},getElements:function(A,D){A=A.split(",");
var C=[];var B=(A.length>1);A.each(function(E){var F=this.getElementsByTagName(E.trim());(B)?C.extend(F):C=F;},this);return new Elements(C,{ddup:B,cash:!D});
}});Element.Storage={get:function(A){return(this[A]||(this[A]={}));}};Element.Inserters=new Hash({before:function(B,A){if(A.parentNode){A.parentNode.insertBefore(B,A);
}},after:function(B,A){if(!A.parentNode){return ;}var C=A.nextSibling;(C)?A.parentNode.insertBefore(B,C):A.parentNode.appendChild(B);},bottom:function(B,A){A.appendChild(B);
},top:function(B,A){var C=A.firstChild;(C)?A.insertBefore(B,C):A.appendChild(B);}});Element.Inserters.inside=Element.Inserters.bottom;Element.Inserters.each(function(C,B){var A=B.capitalize();
Element.implement("inject"+A,function(D){C(this,$(D,true));return this;});Element.implement("grab"+A,function(D){C($(D,true),this);return this;});});Element.implement({getDocument:function(){return this.ownerDocument;
},getWindow:function(){return this.ownerDocument.getWindow();},getElementById:function(D,C){var B=this.ownerDocument.getElementById(D);if(!B){return null;
}for(var A=B.parentNode;A!=this;A=A.parentNode){if(!A){return null;}}return $.element(B,C);},set:function(D,B){switch($type(D)){case"object":for(var C in D){this.set(C,D[C]);
}break;case"string":var A=Element.Properties.get(D);(A&&A.set)?A.set.apply(this,Array.slice(arguments,1)):this.setProperty(D,B);}return this;},get:function(B){var A=Element.Properties.get(B);
return(A&&A.get)?A.get.apply(this,Array.slice(arguments,1)):this.getProperty(B);},erase:function(B){var A=Element.Properties.get(B);(A&&A.erase)?A.erase.apply(this,Array.slice(arguments,1)):this.removeProperty(B);
return this;},match:function(A){return(!A||Element.get(this,"tag")==A);},inject:function(B,A){Element.Inserters.get(A||"bottom")(this,$(B,true));return this;
},wraps:function(B,A){B=$(B,true);return this.replaces(B).grab(B,A);},grab:function(B,A){Element.Inserters.get(A||"bottom")($(B,true),this);return this;
},appendText:function(B,A){return this.grab(this.getDocument().newTextNode(B),A);},adopt:function(){Array.flatten(arguments).each(function(A){A=$(A,true);
if(A){this.appendChild(A);}},this);return this;},dispose:function(){return(this.parentNode)?this.parentNode.removeChild(this):this;},clone:function(D,C){switch($type(this)){case"element":var H={};
for(var G=0,E=this.attributes.length;G<E;G++){var B=this.attributes[G],L=B.nodeName.toLowerCase();if(Browser.Engine.trident&&(/input/i).test(this.tagName)&&(/width|height/).test(L)){continue;
}var K=(L=="style"&&this.style)?this.style.cssText:B.nodeValue;if(!$chk(K)||L=="uid"||(L=="id"&&!C)){continue;}if(K!="inherit"&&["string","number"].contains($type(K))){H[L]=K;
}}var J=new Element(this.nodeName.toLowerCase(),H);if(D!==false){for(var I=0,F=this.childNodes.length;I<F;I++){var A=Element.clone(this.childNodes[I],true,C);
if(A){J.grab(A);}}}return J;case"textnode":return document.newTextNode(this.nodeValue);}return null;},replaces:function(A){A=$(A,true);A.parentNode.replaceChild(this,A);
return this;},hasClass:function(A){return this.className.contains(A," ");},addClass:function(A){if(!this.hasClass(A)){this.className=(this.className+" "+A).clean();
}return this;},removeClass:function(A){this.className=this.className.replace(new RegExp("(^|\\s)"+A+"(?:\\s|$)"),"$1").clean();return this;},toggleClass:function(A){return this.hasClass(A)?this.removeClass(A):this.addClass(A);
},getComputedStyle:function(B){if(this.currentStyle){return this.currentStyle[B.camelCase()];}var A=this.getWindow().getComputedStyle(this,null);return(A)?A.getPropertyValue([B.hyphenate()]):null;
},empty:function(){$A(this.childNodes).each(function(A){Browser.freeMem(A);Element.empty(A);Element.dispose(A);},this);return this;},destroy:function(){Browser.freeMem(this.empty().dispose());
return null;},getSelected:function(){return new Elements($A(this.options).filter(function(A){return A.selected;}));},toQueryString:function(){var A=[];
this.getElements("input, select, textarea").each(function(B){if(!B.name||B.disabled){return ;}var C=(B.tagName.toLowerCase()=="select")?Element.getSelected(B).map(function(D){return D.value;
}):((B.type=="radio"||B.type=="checkbox")&&!B.checked)?null:B.value;$splat(C).each(function(D){if(D){A.push(B.name+"="+encodeURIComponent(D));}});});return A.join("&");
},getProperty:function(C){var B=Element.Attributes,A=B.Props[C];var D=(A)?this[A]:this.getAttribute(C,2);return(B.Bools[C])?!!D:(A)?D:D||null;},getProperties:function(){var A=$A(arguments);
return A.map(function(B){return this.getProperty(B);},this).associate(A);},setProperty:function(D,E){var C=Element.Attributes,B=C.Props[D],A=$defined(E);
if(B&&C.Bools[D]){E=(E||!A)?true:false;}else{if(!A){return this.removeProperty(D);}}(B)?this[B]=E:this.setAttribute(D,E);return this;},setProperties:function(A){for(var B in A){this.setProperty(B,A[B]);
}return this;},removeProperty:function(D){var C=Element.Attributes,B=C.Props[D],A=(B&&C.Bools[D]);(B)?this[B]=(A)?false:"":this.removeAttribute(D);return this;
},removeProperties:function(){Array.each(arguments,this.removeProperty,this);return this;}});(function(){var A=function(D,B,I,C,F,H){var E=D[I||B];var G=[];
while(E){if(E.nodeType==1&&(!C||Element.match(E,C))){G.push(E);if(!F){break;}}E=E[B];}return(F)?new Elements(G,{ddup:false,cash:!H}):$(G[0],H);};Element.implement({getPrevious:function(B,C){return A(this,"previousSibling",null,B,false,C);
},getAllPrevious:function(B,C){return A(this,"previousSibling",null,B,true,C);},getNext:function(B,C){return A(this,"nextSibling",null,B,false,C);},getAllNext:function(B,C){return A(this,"nextSibling",null,B,true,C);
},getFirst:function(B,C){return A(this,"nextSibling","firstChild",B,false,C);},getLast:function(B,C){return A(this,"previousSibling","lastChild",B,false,C);
},getParent:function(B,C){return A(this,"parentNode",null,B,false,C);},getParents:function(B,C){return A(this,"parentNode",null,B,true,C);},getChildren:function(B,C){return A(this,"nextSibling","firstChild",B,true,C);
},hasChild:function(B){B=$(B,true);return(!!B&&$A(this.getElementsByTagName(B.tagName)).contains(B));}});})();Element.Properties=new Hash;Element.Properties.style={set:function(A){this.style.cssText=A;
},get:function(){return this.style.cssText;},erase:function(){this.style.cssText="";}};Element.Properties.tag={get:function(){return this.tagName.toLowerCase();
}};Element.Properties.href={get:function(){return(!this.href)?null:this.href.replace(new RegExp("^"+document.location.protocol+"//"+document.location.host),"");
}};Element.Properties.html={set:function(){return this.innerHTML=Array.flatten(arguments).join("");}};Native.implement([Element,Window,Document],{addListener:function(B,A){if(this.addEventListener){this.addEventListener(B,A,false);
}else{this.attachEvent("on"+B,A);}return this;},removeListener:function(B,A){if(this.removeEventListener){this.removeEventListener(B,A,false);}else{this.detachEvent("on"+B,A);
}return this;},retrieve:function(B,A){var D=Element.Storage.get(this.uid);var C=D[B];if($defined(A)&&!$defined(C)){C=D[B]=A;}return $pick(C);},store:function(B,A){var C=Element.Storage.get(this.uid);
C[B]=A;return this;},eliminate:function(A){var B=Element.Storage.get(this.uid);delete B[A];return this;}});Element.Attributes=new Hash({Props:{html:"innerHTML","class":"className","for":"htmlFor",text:(Browser.Engine.trident)?"innerText":"textContent"},Bools:["compact","nowrap","ismap","declare","noshade","checked","disabled","readonly","multiple","selected","noresize","defer"],Camels:["value","accessKey","cellPadding","cellSpacing","colSpan","frameBorder","maxLength","readOnly","rowSpan","tabIndex","useMap"]});
Browser.freeMem=function(A){if(!A){return ;}if(Browser.Engine.trident&&(/object/i).test(A.tagName)){for(var B in A){if(typeof A[B]=="function"){A[B]=$empty;
}}Element.dispose(A);}if(A.uid&&A.removeEvents){A.removeEvents();}};(function(B){var C=B.Bools,A=B.Camels;B.Bools=C=C.associate(C);Hash.extend(Hash.combine(B.Props,C),A.associate(A.map(function(D){return D.toLowerCase();
})));B.erase("Camels");})(Element.Attributes);window.addListener("unload",function(){window.removeListener("unload",arguments.callee);document.purge();
if(Browser.Engine.trident){CollectGarbage();}});Element.Properties.events={set:function(A){this.addEvents(A);}};Native.implement([Element,Window,Document],{addEvent:function(E,G){var H=this.retrieve("events",{});
H[E]=H[E]||{keys:[],values:[]};if(H[E].keys.contains(G)){return this;}H[E].keys.push(G);var F=E,A=Element.Events.get(E),C=G,I=this;if(A){if(A.onAdd){A.onAdd.call(this,G);
}if(A.condition){C=function(J){if(A.condition.call(this,J)){return G.call(this,J);}return false;};}F=A.base||F;}var D=function(){return G.call(I);};var B=Element.NativeEvents[F]||0;
if(B){if(B==2){D=function(J){J=new Event(J,I.getWindow());if(C.call(I,J)===false){J.stop();}};}this.addListener(F,D);}H[E].values.push(D);return this;},removeEvent:function(D,C){var B=this.retrieve("events");
if(!B||!B[D]){return this;}var G=B[D].keys.indexOf(C);if(G==-1){return this;}var A=B[D].keys.splice(G,1)[0];var F=B[D].values.splice(G,1)[0];var E=Element.Events.get(D);
if(E){if(E.onRemove){E.onRemove.call(this,C);}D=E.base||D;}return(Element.NativeEvents[D])?this.removeListener(D,F):this;},addEvents:function(A){for(var B in A){this.addEvent(B,A[B]);
}return this;},removeEvents:function(B){var A=this.retrieve("events");if(!A){return this;}if(!B){for(var C in A){this.removeEvents(C);}A=null;}else{if(A[B]){while(A[B].keys[0]){this.removeEvent(B,A[B].keys[0]);
}A[B]=null;}}return this;},fireEvent:function(D,B,A){var C=this.retrieve("events");if(!C||!C[D]){return this;}C[D].keys.each(function(E){E.create({bind:this,delay:A,"arguments":B})();
},this);return this;},cloneEvents:function(D,A){D=$(D);var C=D.retrieve("events");if(!C){return this;}if(!A){for(var B in C){this.cloneEvents(D,B);}}else{if(C[A]){C[A].keys.each(function(E){this.addEvent(A,E);
},this);}}return this;}});Element.NativeEvents={click:2,dblclick:2,mouseup:2,mousedown:2,contextmenu:2,mousewheel:2,DOMMouseScroll:2,mouseover:2,mouseout:2,mousemove:2,selectstart:2,selectend:2,keydown:2,keypress:2,keyup:2,focus:2,blur:2,change:2,reset:2,select:2,submit:2,load:1,unload:1,beforeunload:2,resize:1,move:1,DOMContentLoaded:1,readystatechange:1,error:1,abort:1,scroll:1};
(function(){var A=function(B){var C=B.relatedTarget;if(C==undefined){return true;}if(C===false){return false;}return($type(this)!="document"&&C!=this&&C.prefix!="xul"&&!this.hasChild(C));
};Element.Events=new Hash({mouseenter:{base:"mouseover",condition:A},mouseleave:{base:"mouseout",condition:A},mousewheel:{base:(Browser.Engine.gecko)?"DOMMouseScroll":"mousewheel"}});
})();Element.Properties.styles={set:function(A){this.setStyles(A);}};Element.Properties.opacity={set:function(A,B){if(!B){if(A==0){if(this.style.visibility!="hidden"){this.style.visibility="hidden";
}}else{if(this.style.visibility!="visible"){this.style.visibility="visible";}}}if(!this.currentStyle||!this.currentStyle.hasLayout){this.style.zoom=1;}if(Browser.Engine.trident){this.style.filter=(A==1)?"":"alpha(opacity="+A*100+")";
}this.style.opacity=A;this.store("opacity",A);},get:function(){return this.retrieve("opacity",1);}};Element.implement({setOpacity:function(A){return this.set("opacity",A,true);
},getOpacity:function(){return this.get("opacity");},setStyle:function(B,A){switch(B){case"opacity":return this.set("opacity",parseFloat(A));case"float":B=(Browser.Engine.trident)?"styleFloat":"cssFloat";
}B=B.camelCase();if($type(A)!="string"){var C=(Element.Styles.get(B)||"@").split(" ");A=$splat(A).map(function(E,D){if(!C[D]){return"";}return($type(E)=="number")?C[D].replace("@",Math.round(E)):E;
}).join(" ");}else{if(A==String(Number(A))){A=Math.round(A);}}this.style[B]=A;return this;},getStyle:function(G){switch(G){case"opacity":return this.get("opacity");
case"float":G=(Browser.Engine.trident)?"styleFloat":"cssFloat";}G=G.camelCase();var A=this.style[G];if(!$chk(A)){A=[];for(var F in Element.ShortStyles){if(G!=F){continue;
}for(var E in Element.ShortStyles[F]){A.push(this.getStyle(E));}return A.join(" ");}A=this.getComputedStyle(G);}if(A){A=String(A);var C=A.match(/rgba?\([\d\s,]+\)/);
if(C){A=A.replace(C[0],C[0].rgbToHex());}}if(Browser.Engine.presto||(Browser.Engine.trident&&!$chk(parseInt(A)))){if(G.test(/^(height|width)$/)){var B=(G=="width")?["left","right"]:["top","bottom"],D=0;
B.each(function(H){D+=this.getStyle("border-"+H+"-width").toInt()+this.getStyle("padding-"+H).toInt();},this);return this["offset"+G.capitalize()]-D+"px";
}if(Browser.Engine.presto&&String(A).test("px")){return A;}if(G.test(/(border(.+)Width|margin|padding)/)){return"0px";}}return A;},setStyles:function(B){for(var A in B){this.setStyle(A,B[A]);
}return this;},getStyles:function(){var A={};Array.each(arguments,function(B){A[B]=this.getStyle(B);},this);return A;}});Element.Styles=new Hash({left:"@px",top:"@px",bottom:"@px",right:"@px",width:"@px",height:"@px",maxWidth:"@px",maxHeight:"@px",minWidth:"@px",minHeight:"@px",backgroundColor:"rgb(@, @, @)",backgroundPosition:"@px @px",color:"rgb(@, @, @)",fontSize:"@px",letterSpacing:"@px",lineHeight:"@px",clip:"rect(@px @px @px @px)",margin:"@px @px @px @px",padding:"@px @px @px @px",border:"@px @ rgb(@, @, @) @px @ rgb(@, @, @) @px @ rgb(@, @, @)",borderWidth:"@px @px @px @px",borderStyle:"@ @ @ @",borderColor:"rgb(@, @, @) rgb(@, @, @) rgb(@, @, @) rgb(@, @, @)",zIndex:"@",zoom:"@",fontWeight:"@",textIndent:"@px",opacity:"@"});
Element.ShortStyles={margin:{},padding:{},border:{},borderWidth:{},borderStyle:{},borderColor:{}};["Top","Right","Bottom","Left"].each(function(G){var F=Element.ShortStyles;
var B=Element.Styles;["margin","padding"].each(function(H){var I=H+G;F[H][I]=B[I]="@px";});var E="border"+G;F.border[E]=B[E]="@px @ rgb(@, @, @)";var D=E+"Width",A=E+"Style",C=E+"Color";
F[E]={};F.borderWidth[D]=F[E][D]=B[D]="@px";F.borderStyle[A]=F[E][A]=B[A]="@";F.borderColor[C]=F[E][C]=B[C]="rgb(@, @, @)";});(function(){Element.implement({scrollTo:function(H,I){if(B(this)){this.getWindow().scrollTo(H,I);
}else{this.scrollLeft=H;this.scrollTop=I;}return this;},getSize:function(){if(B(this)){return this.getWindow().getSize();}return{x:this.offsetWidth,y:this.offsetHeight};
},getScrollSize:function(){if(B(this)){return this.getWindow().getScrollSize();}return{x:this.scrollWidth,y:this.scrollHeight};},getScroll:function(){if(B(this)){return this.getWindow().getScroll();
}return{x:this.scrollLeft,y:this.scrollTop};},getScrolls:function(){var I=this,H={x:0,y:0};while(I&&!B(I)){H.x+=I.scrollLeft;H.y+=I.scrollTop;I=I.parentNode;
}return H;},getOffsetParent:function(){var H=this;if(B(H)){return null;}if(!Browser.Engine.trident){return H.offsetParent;}while((H=H.parentNode)&&!B(H)){if(D(H,"position")!="static"){return H;
}}return null;},getOffsets:function(){var I=this,H={x:0,y:0};if(B(this)){return H;}while(I&&!B(I)){H.x+=I.offsetLeft;H.y+=I.offsetTop;if(Browser.Engine.gecko){if(!F(I)){H.x+=C(I);
H.y+=G(I);}var J=I.parentNode;if(J&&D(J,"overflow")!="visible"){H.x+=C(J);H.y+=G(J);}}else{if(I!=this&&(Browser.Engine.trident||Browser.Engine.webkit)){H.x+=C(I);
H.y+=G(I);}}I=I.offsetParent;if(Browser.Engine.trident){while(I&&!I.currentStyle.hasLayout){I=I.offsetParent;}}}if(Browser.Engine.gecko&&!F(this)){H.x-=C(this);
H.y-=G(this);}return H;},getPosition:function(K){if(B(this)){return{x:0,y:0};}var L=this.getOffsets(),I=this.getScrolls();var H={x:L.x-I.x,y:L.y-I.y};var J=(K&&(K=$(K)))?K.getPosition():{x:0,y:0};
return{x:H.x-J.x,y:H.y-J.y};},getCoordinates:function(J){if(B(this)){return this.getWindow().getCoordinates();}var H=this.getPosition(J),I=this.getSize();
var K={left:H.x,top:H.y,width:I.x,height:I.y};K.right=K.left+K.width;K.bottom=K.top+K.height;return K;},computePosition:function(H){return{left:H.x-E(this,"margin-left"),top:H.y-E(this,"margin-top")};
},position:function(H){return this.setStyles(this.computePosition(H));}});Native.implement([Document,Window],{getSize:function(){var I=this.getWindow();
if(Browser.Engine.presto||Browser.Engine.webkit){return{x:I.innerWidth,y:I.innerHeight};}var H=A(this);return{x:H.clientWidth,y:H.clientHeight};},getScroll:function(){var I=this.getWindow();
var H=A(this);return{x:I.pageXOffset||H.scrollLeft,y:I.pageYOffset||H.scrollTop};},getScrollSize:function(){var I=A(this);var H=this.getSize();return{x:Math.max(I.scrollWidth,H.x),y:Math.max(I.scrollHeight,H.y)};
},getPosition:function(){return{x:0,y:0};},getCoordinates:function(){var H=this.getSize();return{top:0,left:0,bottom:H.y,right:H.x,height:H.y,width:H.x};
}});var D=Element.getComputedStyle;function E(H,I){return D(H,I).toInt()||0;}function F(H){return D(H,"-moz-box-sizing")=="border-box";}function G(H){return E(H,"border-top-width");
}function C(H){return E(H,"border-left-width");}function B(H){return(/^(?:body|html)$/i).test(H.tagName);}function A(H){var I=H.getDocument();return(!I.compatMode||I.compatMode=="CSS1Compat")?I.html:I.body;
}})();Native.implement([Window,Document,Element],{getHeight:function(){return this.getSize().y;},getWidth:function(){return this.getSize().x;},getScrollTop:function(){return this.getScroll().y;
},getScrollLeft:function(){return this.getScroll().x;},getScrollHeight:function(){return this.getScrollSize().y;},getScrollWidth:function(){return this.getScrollSize().x;
},getTop:function(){return this.getPosition().y;},getLeft:function(){return this.getPosition().x;}});Native.implement([Document,Element],{getElements:function(H,G){H=H.split(",");
var C,E={};for(var D=0,B=H.length;D<B;D++){var A=H[D],F=Selectors.Utils.search(this,A,E);if(D!=0&&F.item){F=$A(F);}C=(D==0)?F:(C.item)?$A(C).concat(F):C.concat(F);
}return new Elements(C,{ddup:(H.length>1),cash:!G});}});Element.implement({match:function(B){if(!B){return true;}var D=Selectors.Utils.parseTagAndID(B);
var A=D[0],E=D[1];if(!Selectors.Filters.byID(this,E)||!Selectors.Filters.byTag(this,A)){return false;}var C=Selectors.Utils.parseSelector(B);return(C)?Selectors.Utils.filter(this,C,{}):true;
}});var Selectors={Cache:{nth:{},parsed:{}}};Selectors.RegExps={id:(/#([\w-]+)/),tag:(/^(\w+|\*)/),quick:(/^(\w+|\*)$/),splitter:(/\s*([+>~\s])\s*([a-zA-Z#.*:\[])/g),combined:(/\.([\w-]+)|\[(\w+)(?:([!*^$~|]?=)["']?(.*?)["']?)?\]|:([\w-]+)(?:\(["']?(.*?)?["']?\)|$)/g)};
Selectors.Utils={chk:function(B,C){if(!C){return true;}var A=$uid(B);if(!C[A]){return C[A]=true;}return false;},parseNthArgument:function(F){if(Selectors.Cache.nth[F]){return Selectors.Cache.nth[F];
}var C=F.match(/^([+-]?\d*)?([a-z]+)?([+-]?\d*)?$/);if(!C){return false;}var E=parseInt(C[1]);var B=(E||E===0)?E:1;var D=C[2]||false;var A=parseInt(C[3])||0;
if(B!=0){A--;while(A<1){A+=B;}while(A>=B){A-=B;}}else{B=A;D="index";}switch(D){case"n":C={a:B,b:A,special:"n"};break;case"odd":C={a:2,b:0,special:"n"};
break;case"even":C={a:2,b:1,special:"n"};break;case"first":C={a:0,special:"index"};break;case"last":C={special:"last-child"};break;case"only":C={special:"only-child"};
break;default:C={a:(B-1),special:"index"};}return Selectors.Cache.nth[F]=C;},parseSelector:function(E){if(Selectors.Cache.parsed[E]){return Selectors.Cache.parsed[E];
}var D,H={classes:[],pseudos:[],attributes:[]};while((D=Selectors.RegExps.combined.exec(E))){var I=D[1],G=D[2],F=D[3],B=D[4],C=D[5],J=D[6];if(I){H.classes.push(I);
}else{if(C){var A=Selectors.Pseudo.get(C);if(A){H.pseudos.push({parser:A,argument:J});}else{H.attributes.push({name:C,operator:"=",value:J});}}else{if(G){H.attributes.push({name:G,operator:F,value:B});
}}}}if(!H.classes.length){delete H.classes;}if(!H.attributes.length){delete H.attributes;}if(!H.pseudos.length){delete H.pseudos;}if(!H.classes&&!H.attributes&&!H.pseudos){H=null;
}return Selectors.Cache.parsed[E]=H;},parseTagAndID:function(B){var A=B.match(Selectors.RegExps.tag);var C=B.match(Selectors.RegExps.id);return[(A)?A[1]:"*",(C)?C[1]:false];
},filter:function(F,C,E){var D;if(C.classes){for(D=C.classes.length;D--;D){var G=C.classes[D];if(!Selectors.Filters.byClass(F,G)){return false;}}}if(C.attributes){for(D=C.attributes.length;
D--;D){var B=C.attributes[D];if(!Selectors.Filters.byAttribute(F,B.name,B.operator,B.value)){return false;}}}if(C.pseudos){for(D=C.pseudos.length;D--;D){var A=C.pseudos[D];
if(!Selectors.Filters.byPseudo(F,A.parser,A.argument,E)){return false;}}}return true;},getByTagAndID:function(B,A,D){if(D){var C=(B.getElementById)?B.getElementById(D,true):Element.getElementById(B,D,true);
return(C&&Selectors.Filters.byTag(C,A))?[C]:[];}else{return B.getElementsByTagName(A);}},search:function(J,I,O){var B=[];var C=I.trim().replace(Selectors.RegExps.splitter,function(Z,Y,X){B.push(Y);
return":)"+X;}).split(":)");var K,F,E,V;for(var U=0,Q=C.length;U<Q;U++){var T=C[U];if(U==0&&Selectors.RegExps.quick.test(T)){K=J.getElementsByTagName(T);
continue;}var A=B[U-1];var L=Selectors.Utils.parseTagAndID(T);var W=L[0],M=L[1];if(U==0){K=Selectors.Utils.getByTagAndID(J,W,M);}else{var D={},H=[];for(var S=0,R=K.length;
S<R;S++){H=Selectors.Getters[A](H,K[S],W,M,D);}K=H;}var G=Selectors.Utils.parseSelector(T);if(G){E=[];for(var P=0,N=K.length;P<N;P++){V=K[P];if(Selectors.Utils.filter(V,G,O)){E.push(V);
}}K=E;}}return K;}};Selectors.Getters={" ":function(H,G,I,A,E){var D=Selectors.Utils.getByTagAndID(G,I,A);for(var C=0,B=D.length;C<B;C++){var F=D[C];if(Selectors.Utils.chk(F,E)){H.push(F);
}}return H;},">":function(H,G,I,A,F){var C=Selectors.Utils.getByTagAndID(G,I,A);for(var E=0,D=C.length;E<D;E++){var B=C[E];if(B.parentNode==G&&Selectors.Utils.chk(B,F)){H.push(B);
}}return H;},"+":function(C,B,A,E,D){while((B=B.nextSibling)){if(B.nodeType==1){if(Selectors.Utils.chk(B,D)&&Selectors.Filters.byTag(B,A)&&Selectors.Filters.byID(B,E)){C.push(B);
}break;}}return C;},"~":function(C,B,A,E,D){while((B=B.nextSibling)){if(B.nodeType==1){if(!Selectors.Utils.chk(B,D)){break;}if(Selectors.Filters.byTag(B,A)&&Selectors.Filters.byID(B,E)){C.push(B);
}}}return C;}};Selectors.Filters={byTag:function(B,A){return(A=="*"||(B.tagName&&B.tagName.toLowerCase()==A));},byID:function(A,B){return(!B||(A.id&&A.id==B));
},byClass:function(B,A){return(B.className&&B.className.contains(A," "));},byPseudo:function(A,D,C,B){return D.call(A,C,B);},byAttribute:function(C,D,B,E){var A=Element.prototype.getProperty.call(C,D);
if(!A){return false;}if(!B||E==undefined){return true;}switch(B){case"=":return(A==E);case"*=":return(A.contains(E));case"^=":return(A.substr(0,E.length)==E);
case"$=":return(A.substr(A.length-E.length)==E);case"!=":return(A!=E);case"~=":return A.contains(E," ");case"|=":return A.contains(E,"-");}return false;
}};Selectors.Pseudo=new Hash({empty:function(){return !(this.innerText||this.textContent||"").length;},not:function(A){return !Element.match(this,A);},contains:function(A){return(this.innerText||this.textContent||"").contains(A);
},"first-child":function(){return Selectors.Pseudo.index.call(this,0);},"last-child":function(){var A=this;while((A=A.nextSibling)){if(A.nodeType==1){return false;
}}return true;},"only-child":function(){var B=this;while((B=B.previousSibling)){if(B.nodeType==1){return false;}}var A=this;while((A=A.nextSibling)){if(A.nodeType==1){return false;
}}return true;},"nth-child":function(G,E){G=(G==undefined)?"n":G;var C=Selectors.Utils.parseNthArgument(G);if(C.special!="n"){return Selectors.Pseudo[C.special].call(this,C.a,E);
}var F=0;E.positions=E.positions||{};var D=$uid(this);if(!E.positions[D]){var B=this;while((B=B.previousSibling)){if(B.nodeType!=1){continue;}F++;var A=E.positions[$uid(B)];
if(A!=undefined){F=A+F;break;}}E.positions[D]=F;}return(E.positions[D]%C.a==C.b);},index:function(A){var B=this,C=0;while((B=B.previousSibling)){if(B.nodeType==1&&++C>A){return false;
}}return(C==A);},even:function(B,A){return Selectors.Pseudo["nth-child"].call(this,"2n+1",A);},odd:function(B,A){return Selectors.Pseudo["nth-child"].call(this,"2n",A);
}});Element.Events.domready={onAdd:function(A){if(Browser.loaded){A.call(this);}}};(function(){var B=function(){if(Browser.loaded){return ;}Browser.loaded=true;
window.fireEvent("domready");document.fireEvent("domready");};switch(Browser.Engine.name){case"webkit":(function(){(["loaded","complete"].contains(document.readyState))?B():arguments.callee.delay(50);
})();break;case"trident":var A=document.createElement("div");(function(){($try(function(){A.doScroll("left");return $(A).inject(document.body).set("html","temp").dispose();
}))?B():arguments.callee.delay(50);})();break;default:window.addEvent("load",B);document.addEvent("DOMContentLoaded",B);}})();var JSON=new Hash({encode:function(B){switch($type(B)){case"string":return'"'+B.replace(/[\x00-\x1f\\"]/g,JSON.$replaceChars)+'"';
case"array":return"["+String(B.map(JSON.encode).filter($defined))+"]";case"object":case"hash":var A=[];Hash.each(B,function(E,D){var C=JSON.encode(E);if(C){A.push(JSON.encode(D)+":"+C);
}});return"{"+A+"}";case"number":case"boolean":return String(B);case false:return"null";}return null;},$specialChars:{"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"},$replaceChars:function(A){return JSON.$specialChars[A]||"\\u00"+Math.floor(A.charCodeAt()/16).toString(16)+(A.charCodeAt()%16).toString(16);
},decode:function(string,secure){if($type(string)!="string"||!string.length){return null;}if(secure&&!(/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(string.replace(/\\./g,"@").replace(/"[^"\\\n\r]*"/g,""))){return null;
}return eval("("+string+")");}});Native.implement([Hash,Array,String,Number],{toJSON:function(){return JSON.encode(this);}});var Cookie=new Class({Implements:Options,options:{path:false,domain:false,duration:false,secure:false,document:document},initialize:function(B,A){this.key=B;
this.setOptions(A);},write:function(B){B=encodeURIComponent(B);if(this.options.domain){B+="; domain="+this.options.domain;}if(this.options.path){B+="; path="+this.options.path;
}if(this.options.duration){var A=new Date();A.setTime(A.getTime()+this.options.duration*24*60*60*1000);B+="; expires="+A.toGMTString();}if(this.options.secure){B+="; secure";
}this.options.document.cookie=this.key+"="+B;return this;},read:function(){var A=this.options.document.cookie.match("(?:^|;)\\s*"+this.key.escapeRegExp()+"=([^;]*)");
return(A)?decodeURIComponent(A[1]):null;},dispose:function(){new Cookie(this.key,$merge(this.options,{duration:-1})).write("");return this;}});Cookie.write=function(B,C,A){return new Cookie(B,A).write(C);
};Cookie.read=function(A){return new Cookie(A).read();};Cookie.dispose=function(B,A){return new Cookie(B,A).dispose();};var Swiff=new Class({Implements:[Options],options:{id:null,height:1,width:1,container:null,properties:{},params:{quality:"high",allowScriptAccess:"always",wMode:"transparent",swLiveConnect:true},callBacks:{},vars:{}},toElement:function(){return this.object;
},initialize:function(L,M){this.instance="Swiff_"+$time();this.setOptions(M);M=this.options;var B=this.id=M.id||this.instance;var A=$(M.container);Swiff.CallBacks[this.instance]={};
var E=M.params,G=M.vars,F=M.callBacks;var H=$extend({height:M.height,width:M.width},M.properties);var K=this;for(var D in F){Swiff.CallBacks[this.instance][D]=(function(N){return function(){return N.apply(K.object,arguments);
};})(F[D]);G[D]="Swiff.CallBacks."+this.instance+"."+D;}E.flashVars=Hash.toQueryString(G);if(Browser.Engine.trident){H.classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000";
E.movie=L;}else{H.type="application/x-shockwave-flash";H.data=L;}var J='<object id="'+B+'"';for(var I in H){J+=" "+I+'="'+H[I]+'"';}J+=">";for(var C in E){if(E[C]){J+='<param name="'+C+'" value="'+E[C]+'" />';
}}J+="</object>";this.object=((A)?A.empty():new Element("div")).set("html",J).firstChild;},replaces:function(A){A=$(A,true);A.parentNode.replaceChild(this.toElement(),A);
return this;},inject:function(A){$(A,true).appendChild(this.toElement());return this;},remote:function(){return Swiff.remote.apply(Swiff,[this.toElement()].extend(arguments));
}});Swiff.CallBacks={};Swiff.remote=function(obj,fn){var rs=obj.CallFunction('<invoke name="'+fn+'" returntype="javascript">'+__flash__argumentsToXML(arguments,2)+"</invoke>");
return eval(rs);};var Fx=new Class({Implements:[Chain,Events,Options],options:{fps:50,unit:false,duration:500,link:"ignore",transition:function(A){return -(Math.cos(Math.PI*A)-1)/2;
}},initialize:function(A){this.subject=this.subject||this;this.setOptions(A);this.options.duration=Fx.Durations[this.options.duration]||this.options.duration.toInt();
var B=this.options.wait;if(B===false){this.options.link="cancel";}},step:function(){var A=$time();if(A<this.time+this.options.duration){var B=this.options.transition((A-this.time)/this.options.duration);
this.set(this.compute(this.from,this.to,B));}else{this.set(this.compute(this.from,this.to,1));this.complete();}},set:function(A){return A;},compute:function(C,B,A){return Fx.compute(C,B,A);
},check:function(A){if(!this.timer){return true;}switch(this.options.link){case"cancel":this.cancel();return true;case"chain":this.chain(A.bind(this,Array.slice(arguments,1)));
return false;}return false;},start:function(B,A){if(!this.check(arguments.callee,B,A)){return this;}this.from=B;this.to=A;this.time=0;this.startTimer();
this.onStart();return this;},complete:function(){if(this.stopTimer()){this.onComplete();}return this;},cancel:function(){if(this.stopTimer()){this.onCancel();
}return this;},onStart:function(){this.fireEvent("start",this.subject);},onComplete:function(){this.fireEvent("complete",this.subject);if(!this.callChain()){this.fireEvent("chainComplete",this.subject);
}},onCancel:function(){this.fireEvent("cancel",this.subject).clearChain();},pause:function(){this.stopTimer();return this;},resume:function(){this.startTimer();
return this;},stopTimer:function(){if(!this.timer){return false;}this.time=$time()-this.time;this.timer=$clear(this.timer);return true;},startTimer:function(){if(this.timer){return false;
}this.time=$time()-this.time;this.timer=this.step.periodical(Math.round(1000/this.options.fps),this);return true;}});Fx.compute=function(C,B,A){return(B-C)*A+C;
};Fx.Durations={"short":250,normal:500,"long":1000};Fx.CSS=new Class({Extends:Fx,prepare:function(D,E,B){B=$splat(B);var C=B[1];if(!$chk(C)){B[1]=B[0];
B[0]=D.getStyle(E);}var A=B.map(this.parse);return{from:A[0],to:A[1]};},parse:function(A){A=$lambda(A)();A=(typeof A=="string")?A.split(" "):$splat(A);
return A.map(function(C){C=String(C);var B=false;Fx.CSS.Parsers.each(function(F,E){if(B){return ;}var D=F.parse(C);if($chk(D)){B={value:D,parser:F};}});
B=B||{value:C,parser:Fx.CSS.Parsers.String};return B;});},compute:function(D,C,B){var A=[];(Math.min(D.length,C.length)).times(function(E){A.push({value:D[E].parser.compute(D[E].value,C[E].value,B),parser:D[E].parser});
});A.$family={name:"fx:css:value"};return A;},serve:function(C,B){if($type(C)!="fx:css:value"){C=this.parse(C);}var A=[];C.each(function(D){A=A.concat(D.parser.serve(D.value,B));
});return A;},render:function(A,D,C,B){A.setStyle(D,this.serve(C,B));},search:function(A){if(Fx.CSS.Cache[A]){return Fx.CSS.Cache[A];}var B={};Array.each(document.styleSheets,function(E,D){var C=E.href;
if(C&&C.contains("://")&&!C.contains(document.domain)){return ;}var F=E.rules||E.cssRules;Array.each(F,function(I,G){if(!I.style){return ;}var H=(I.selectorText)?I.selectorText.replace(/^\w+/,function(J){return J.toLowerCase();
}):null;if(!H||!H.test("^"+A+"$")){return ;}Element.Styles.each(function(K,J){if(!I.style[J]||Element.ShortStyles[J]){return ;}K=String(I.style[J]);B[J]=(K.test(/^rgb/))?K.rgbToHex():K;
});});});return Fx.CSS.Cache[A]=B;}});Fx.CSS.Cache={};Fx.CSS.Parsers=new Hash({Color:{parse:function(A){if(A.match(/^#[0-9a-f]{3,6}$/i)){return A.hexToRgb(true);
}return((A=A.match(/(\d+),\s*(\d+),\s*(\d+)/)))?[A[1],A[2],A[3]]:false;},compute:function(C,B,A){return C.map(function(E,D){return Math.round(Fx.compute(C[D],B[D],A));
});},serve:function(A){return A.map(Number);}},Number:{parse:parseFloat,compute:Fx.compute,serve:function(B,A){return(A)?B+A:B;}},String:{parse:$lambda(false),compute:$arguments(1),serve:$arguments(0)}});
Fx.Tween=new Class({Extends:Fx.CSS,initialize:function(B,A){this.element=this.subject=$(B);this.parent(A);},set:function(B,A){if(arguments.length==1){A=B;
B=this.property||this.options.property;}this.render(this.element,B,A,this.options.unit);return this;},start:function(C,E,D){if(!this.check(arguments.callee,C,E,D)){return this;
}var B=Array.flatten(arguments);this.property=this.options.property||B.shift();var A=this.prepare(this.element,this.property,B);return this.parent(A.from,A.to);
}});Element.Properties.tween={set:function(A){var B=this.retrieve("tween");if(B){B.cancel();}return this.eliminate("tween").store("tween:options",$extend({link:"cancel"},A));
},get:function(A){if(A||!this.retrieve("tween")){if(A||!this.retrieve("tween:options")){this.set("tween",A);}this.store("tween",new Fx.Tween(this,this.retrieve("tween:options")));
}return this.retrieve("tween");}};Element.implement({tween:function(A,C,B){this.get("tween").start(arguments);return this;},fade:function(C){var E=this.get("tween"),D="opacity",A;
C=$pick(C,"toggle");switch(C){case"in":E.start(D,1);break;case"out":E.start(D,0);break;case"show":E.set(D,1);break;case"hide":E.set(D,0);break;case"toggle":var B=this.retrieve("fade:flag",this.get("opacity")==1);
E.start(D,(B)?0:1);this.store("fade:flag",!B);A=true;break;default:E.start(D,arguments);}if(!A){this.eliminate("fade:flag");}return this;},highlight:function(C,A){if(!A){A=this.retrieve("highlight:original",this.getStyle("background-color"));
A=(A=="transparent")?"#fff":A;}var B=this.get("tween");B.start("background-color",C||"#ffff88",A).chain(function(){this.setStyle("background-color",this.retrieve("highlight:original"));
B.callChain();}.bind(this));return this;}});Fx.Morph=new Class({Extends:Fx.CSS,initialize:function(B,A){this.element=this.subject=$(B);this.parent(A);},set:function(A){if(typeof A=="string"){A=this.search(A);
}for(var B in A){this.render(this.element,B,A[B],this.options.unit);}return this;},compute:function(E,D,C){var A={};for(var B in E){A[B]=this.parent(E[B],D[B],C);
}return A;},start:function(B){if(!this.check(arguments.callee,B)){return this;}if(typeof B=="string"){B=this.search(B);}var E={},D={};for(var C in B){var A=this.prepare(this.element,C,B[C]);
E[C]=A.from;D[C]=A.to;}return this.parent(E,D);}});Element.Properties.morph={set:function(A){var B=this.retrieve("morph");if(B){B.cancel();}return this.eliminate("morph").store("morph:options",$extend({link:"cancel"},A));
},get:function(A){if(A||!this.retrieve("morph")){if(A||!this.retrieve("morph:options")){this.set("morph",A);}this.store("morph",new Fx.Morph(this,this.retrieve("morph:options")));
}return this.retrieve("morph");}};Element.implement({morph:function(A){this.get("morph").start(A);return this;}});(function(){var A=Fx.prototype.initialize;
Fx.prototype.initialize=function(B){A.call(this,B);var C=this.options.transition;if(typeof C=="string"&&(C=C.split(":"))){var D=Fx.Transitions;D=D[C[0]]||D[C[0].capitalize()];
if(C[1]){D=D["ease"+C[1].capitalize()+(C[2]?C[2].capitalize():"")];}this.options.transition=D;}};})();Fx.Transition=function(B,A){A=$splat(A);return $extend(B,{easeIn:function(C){return B(C,A);
},easeOut:function(C){return 1-B(1-C,A);},easeInOut:function(C){return(C<=0.5)?B(2*C,A)/2:(2-B(2*(1-C),A))/2;}});};Fx.Transitions=new Hash({linear:$arguments(0)});
Fx.Transitions.extend=function(A){for(var B in A){Fx.Transitions[B]=new Fx.Transition(A[B]);}};Fx.Transitions.extend({Pow:function(B,A){return Math.pow(B,A[0]||6);
},Expo:function(A){return Math.pow(2,8*(A-1));},Circ:function(A){return 1-Math.sin(Math.acos(A));},Sine:function(A){return 1-Math.sin((1-A)*Math.PI/2);
},Back:function(B,A){A=A[0]||1.618;return Math.pow(B,2)*((A+1)*B-A);},Bounce:function(D){var C;for(var B=0,A=1;1;B+=A,A/=2){if(D>=(7-4*B)/11){C=-Math.pow((11-6*B-11*D)/4,2)+A*A;
break;}}return C;},Elastic:function(B,A){return Math.pow(2,10*--B)*Math.cos(20*B*Math.PI*(A[0]||1)/3);}});["Quad","Cubic","Quart","Quint"].each(function(B,A){Fx.Transitions[B]=new Fx.Transition(function(C){return Math.pow(C,[A+2]);
});});var Request=new Class({Implements:[Chain,Events,Options],options:{url:"",data:"",headers:{"X-Requested-With":"XMLHttpRequest",Accept:"text/javascript, text/html, application/xml, text/xml, */*"},async:true,format:false,method:"post",link:"ignore",isSuccess:null,emulation:true,urlEncoded:true,encoding:"utf-8",evalScripts:false,evalResponse:false},initialize:function(A){this.xhr=new Browser.Request();
this.setOptions(A);this.options.isSuccess=this.options.isSuccess||this.isSuccess;this.headers=new Hash(this.options.headers);},onStateChange:function(){if(this.xhr.readyState!=4||!this.running){return ;
}this.running=false;this.status=0;$try(function(){this.status=this.xhr.status;}.bind(this));if(this.options.isSuccess.call(this,this.status)){this.response={text:this.xhr.responseText,xml:this.xhr.responseXML};
this.success(this.response.text,this.response.xml);}else{this.response={text:null,xml:null};this.failure();}this.xhr.onreadystatechange=$empty;},isSuccess:function(){return((this.status>=200)&&(this.status<300));
},processScripts:function(A){if(this.options.evalResponse||(/(ecma|java)script/).test(this.getHeader("Content-type"))){return $exec(A);}return A.stripScripts(this.options.evalScripts);
},success:function(B,A){this.onSuccess(this.processScripts(B),A);},onSuccess:function(){this.fireEvent("complete",arguments).fireEvent("success",arguments).callChain();
},failure:function(){this.onFailure();},onFailure:function(){this.fireEvent("complete").fireEvent("failure",this.xhr);},setHeader:function(A,B){this.headers.set(A,B);
return this;},getHeader:function(A){return $try(function(){return this.xhr.getResponseHeader(A);}.bind(this));},check:function(A){if(!this.running){return true;
}switch(this.options.link){case"cancel":this.cancel();return true;case"chain":this.chain(A.bind(this,Array.slice(arguments,1)));return false;}return false;
},send:function(I){if(!this.check(arguments.callee,I)){return this;}this.running=true;var G=$type(I);if(G=="string"||G=="element"){I={data:I};}var D=this.options;
I=$extend({data:D.data,url:D.url,method:D.method},I);var E=I.data,B=I.url,A=I.method;switch($type(E)){case"element":E=$(E).toQueryString();break;case"object":case"hash":E=Hash.toQueryString(E);
}if(this.options.format){var H="format="+this.options.format;E=(E)?H+"&"+E:H;}if(this.options.emulation&&["put","delete"].contains(A)){var F="_method="+A;
E=(E)?F+"&"+E:F;A="post";}if(this.options.urlEncoded&&A=="post"){var C=(this.options.encoding)?"; charset="+this.options.encoding:"";this.headers.set("Content-type","application/x-www-form-urlencoded"+C);
}if(E&&A=="get"){B=B+(B.contains("?")?"&":"?")+E;E=null;}this.xhr.open(A.toUpperCase(),B,this.options.async);this.xhr.onreadystatechange=this.onStateChange.bind(this);
this.headers.each(function(K,J){if(!$try(function(){this.xhr.setRequestHeader(J,K);return true;}.bind(this))){this.fireEvent("exception",[J,K]);}},this);
this.fireEvent("request");this.xhr.send(E);if(!this.options.async){this.onStateChange();}return this;},cancel:function(){if(!this.running){return this;
}this.running=false;this.xhr.abort();this.xhr.onreadystatechange=$empty;this.xhr=new Browser.Request();this.fireEvent("cancel");return this;}});(function(){var A={};
["get","post","put","delete","GET","POST","PUT","DELETE"].each(function(B){A[B]=function(){var C=Array.link(arguments,{url:String.type,data:$defined});
return this.send($extend(C,{method:B.toLowerCase()}));};});Request.implement(A);})();Element.Properties.send={set:function(A){var B=this.retrieve("send");
if(B){B.cancel();}return this.eliminate("send").store("send:options",$extend({data:this,link:"cancel",method:this.get("method")||"post",url:this.get("action")},A));
},get:function(A){if(A||!this.retrieve("send")){if(A||!this.retrieve("send:options")){this.set("send",A);}this.store("send",new Request(this.retrieve("send:options")));
}return this.retrieve("send");}};Element.implement({send:function(A){var B=this.get("send");B.send({data:this,url:A||B.options.url});return this;}});Request.HTML=new Class({Extends:Request,options:{update:false,evalScripts:true,filter:false},processHTML:function(C){var B=C.match(/<body[^>]*>([\s\S]*?)<\/body>/i);
C=(B)?B[1]:C;var A=new Element("div");return $try(function(){var D="<root>"+C+"</root>",G;if(Browser.Engine.trident){G=new ActiveXObject("Microsoft.XMLDOM");
G.async=false;G.loadXML(D);}else{G=new DOMParser().parseFromString(D,"text/xml");}D=G.getElementsByTagName("root")[0];for(var F=0,E=D.childNodes.length;
F<E;F++){var H=Element.clone(D.childNodes[F],true,true);if(H){A.grab(H);}}return A;})||A.set("html",C);},success:function(D){var C=this.options,B=this.response;
B.html=D.stripScripts(function(E){B.javascript=E;});var A=this.processHTML(B.html);B.tree=A.childNodes;B.elements=A.getElements("*");if(C.filter){B.tree=B.elements.filter(C.filter);
}if(C.update){$(C.update).empty().adopt(B.tree);}if(C.evalScripts){$exec(B.javascript);}this.onSuccess(B.tree,B.elements,B.html,B.javascript);}});Element.Properties.load={set:function(A){var B=this.retrieve("load");
if(B){send.cancel();}return this.eliminate("load").store("load:options",$extend({data:this,link:"cancel",update:this,method:"get"},A));},get:function(A){if(A||!this.retrieve("load")){if(A||!this.retrieve("load:options")){this.set("load",A);
}this.store("load",new Request.HTML(this.retrieve("load:options")));}return this.retrieve("load");}};Element.implement({load:function(){this.get("load").send(Array.link(arguments,{data:Object.type,url:String.type}));
return this;}});Request.JSON=new Class({Extends:Request,options:{secure:true},initialize:function(A){this.parent(A);this.headers.extend({Accept:"application/json","X-Request":"JSON"});
},success:function(A){this.response.json=JSON.decode(A,this.options.secure);this.onSuccess(this.response.json,A);}});
/* mootools12-more.js start *///MooTools More, <http://mootools.net/more>. Copyright (c) 2006-2008 Valerio Proietti, <http://mad4milk.net>, MIT Style License.

Fx.Slide=new Class({Extends:Fx,options:{mode:"vertical"},initialize:function(B,A){this.addEvent("complete",function(){this.open=(this.wrapper["offset"+this.layout.capitalize()]!=0);
if(this.open&&Browser.Engine.webkit419){this.element.dispose().inject(this.wrapper);}},true);this.element=this.subject=$(B);this.parent(A);var C=this.element.retrieve("wrapper");
this.wrapper=C||new Element("div",{styles:$extend(this.element.getStyles("margin","position"),{overflow:"hidden"})}).wraps(this.element);this.element.store("wrapper",this.wrapper).setStyle("margin",0);
this.now=[];this.open=true;},vertical:function(){this.margin="margin-top";this.layout="height";this.offset=this.element.offsetHeight;},horizontal:function(){this.margin="margin-left";
this.layout="width";this.offset=this.element.offsetWidth;},set:function(A){this.element.setStyle(this.margin,A[0]);this.wrapper.setStyle(this.layout,A[1]);
return this;},compute:function(E,D,C){var B=[];var A=2;A.times(function(F){B[F]=Fx.compute(E[F],D[F],C);});return B;},start:function(B,E){if(!this.check(arguments.callee,B,E)){return this;
}this[E||this.options.mode]();var D=this.element.getStyle(this.margin).toInt();var C=this.wrapper.getStyle(this.layout).toInt();var A=[[D,C],[0,this.offset]];
var G=[[D,C],[-this.offset,0]];var F;switch(B){case"in":F=A;break;case"out":F=G;break;case"toggle":F=(this.wrapper["offset"+this.layout.capitalize()]==0)?A:G;
}return this.parent(F[0],F[1]);},slideIn:function(A){return this.start("in",A);},slideOut:function(A){return this.start("out",A);},hide:function(A){this[A||this.options.mode]();
this.open=false;return this.set([-this.offset,0]);},show:function(A){this[A||this.options.mode]();this.open=true;return this.set([0,this.offset]);},toggle:function(A){return this.start("toggle",A);
}});Element.Properties.slide={set:function(B){var A=this.retrieve("slide");if(A){A.cancel();}return this.eliminate("slide").store("slide:options",$extend({link:"cancel"},B));
},get:function(A){if(A||!this.retrieve("slide")){if(A||!this.retrieve("slide:options")){this.set("slide",A);}this.store("slide",new Fx.Slide(this,this.retrieve("slide:options")));
}return this.retrieve("slide");}};Element.implement({slide:function(D,E){D=D||"toggle";var B=this.get("slide"),A;switch(D){case"hide":B.hide(E);break;case"show":B.show(E);
break;case"toggle":var C=this.retrieve("slide:flag",B.open);B[(C)?"slideOut":"slideIn"](E);this.store("slide:flag",!C);A=true;break;default:B.start(D,E);
}if(!A){this.eliminate("slide:flag");}return this;}});Fx.Scroll=new Class({Extends:Fx,options:{offset:{x:0,y:0},wheelStops:true},initialize:function(B,A){this.element=this.subject=$(B);
this.parent(A);var D=this.cancel.bind(this,false);if($type(this.element)!="element"){this.element=$(this.element.getDocument().body);}var C=this.element;
if(this.options.wheelStops){this.addEvent("start",function(){C.addEvent("mousewheel",D);},true);this.addEvent("complete",function(){C.removeEvent("mousewheel",D);
},true);}},set:function(){var A=Array.flatten(arguments);this.element.scrollTo(A[0],A[1]);},compute:function(E,D,C){var B=[];var A=2;A.times(function(F){B.push(Fx.compute(E[F],D[F],C));
});return B;},start:function(C,H){if(!this.check(arguments.callee,C,H)){return this;}var E=this.element.getSize(),F=this.element.getScrollSize();var B=this.element.getScroll(),D={x:C,y:H};
for(var G in D){var A=F[G]-E[G];if($chk(D[G])){D[G]=($type(D[G])=="number")?D[G].limit(0,A):A;}else{D[G]=B[G];}D[G]+=this.options.offset[G];}return this.parent([B.x,B.y],[D.x,D.y]);
},toTop:function(){return this.start(false,0);},toLeft:function(){return this.start(0,false);},toRight:function(){return this.start("right",false);},toBottom:function(){return this.start(false,"bottom");
},toElement:function(B){var A=$(B).getPosition(this.element);return this.start(A.x,A.y);}});Fx.Elements=new Class({Extends:Fx.CSS,initialize:function(B,A){this.elements=this.subject=$$(B);
this.parent(A);},compute:function(G,H,I){var C={};for(var D in G){var A=G[D],E=H[D],F=C[D]={};for(var B in A){F[B]=this.parent(A[B],E[B],I);}}return C;
},set:function(B){for(var C in B){var A=B[C];for(var D in A){this.render(this.elements[C],D,A[D],this.options.unit);}}return this;},start:function(C){if(!this.check(arguments.callee,C)){return this;
}var H={},I={};for(var D in C){var F=C[D],A=H[D]={},G=I[D]={};for(var B in F){var E=this.prepare(this.elements[D],B,F[B]);A[B]=E.from;G[B]=E.to;}}return this.parent(H,I);
}});var Drag=new Class({Implements:[Events,Options],options:{snap:6,unit:"px",grid:false,style:true,limit:false,handle:false,invert:false,preventDefault:false,modifiers:{x:"left",y:"top"}},initialize:function(){var B=Array.link(arguments,{options:Object.type,element:$defined});
this.element=$(B.element);this.document=this.element.getDocument();this.setOptions(B.options||{});var A=$type(this.options.handle);this.handles=(A=="array"||A=="collection")?$$(this.options.handle):$(this.options.handle)||this.element;
this.mouse={now:{},pos:{}};this.value={start:{},now:{}};this.selection=(Browser.Engine.trident)?"selectstart":"mousedown";this.bound={start:this.start.bind(this),check:this.check.bind(this),drag:this.drag.bind(this),stop:this.stop.bind(this),cancel:this.cancel.bind(this),eventStop:$lambda(false)};
this.attach();},attach:function(){this.handles.addEvent("mousedown",this.bound.start);return this;},detach:function(){this.handles.removeEvent("mousedown",this.bound.start);
return this;},start:function(C){if(this.options.preventDefault){C.preventDefault();}this.fireEvent("beforeStart",this.element);this.mouse.start=C.page;
var A=this.options.limit;this.limit={x:[],y:[]};for(var D in this.options.modifiers){if(!this.options.modifiers[D]){continue;}if(this.options.style){this.value.now[D]=this.element.getStyle(this.options.modifiers[D]).toInt();
}else{this.value.now[D]=this.element[this.options.modifiers[D]];}if(this.options.invert){this.value.now[D]*=-1;}this.mouse.pos[D]=C.page[D]-this.value.now[D];
if(A&&A[D]){for(var B=2;B--;B){if($chk(A[D][B])){this.limit[D][B]=$lambda(A[D][B])();}}}}if($type(this.options.grid)=="number"){this.options.grid={x:this.options.grid,y:this.options.grid};
}this.document.addEvents({mousemove:this.bound.check,mouseup:this.bound.cancel});this.document.addEvent(this.selection,this.bound.eventStop);},check:function(A){if(this.options.preventDefault){A.preventDefault();
}var B=Math.round(Math.sqrt(Math.pow(A.page.x-this.mouse.start.x,2)+Math.pow(A.page.y-this.mouse.start.y,2)));if(B>this.options.snap){this.cancel();this.document.addEvents({mousemove:this.bound.drag,mouseup:this.bound.stop});
this.fireEvent("start",this.element).fireEvent("snap",this.element);}},drag:function(A){if(this.options.preventDefault){A.preventDefault();}this.mouse.now=A.page;
for(var B in this.options.modifiers){if(!this.options.modifiers[B]){continue;}this.value.now[B]=this.mouse.now[B]-this.mouse.pos[B];if(this.options.invert){this.value.now[B]*=-1;
}if(this.options.limit&&this.limit[B]){if($chk(this.limit[B][1])&&(this.value.now[B]>this.limit[B][1])){this.value.now[B]=this.limit[B][1];}else{if($chk(this.limit[B][0])&&(this.value.now[B]<this.limit[B][0])){this.value.now[B]=this.limit[B][0];
}}}if(this.options.grid[B]){this.value.now[B]-=(this.value.now[B]%this.options.grid[B]);}if(this.options.style){this.element.setStyle(this.options.modifiers[B],this.value.now[B]+this.options.unit);
}else{this.element[this.options.modifiers[B]]=this.value.now[B];}}this.fireEvent("drag",this.element);},cancel:function(A){this.document.removeEvent("mousemove",this.bound.check);
this.document.removeEvent("mouseup",this.bound.cancel);if(A){this.document.removeEvent(this.selection,this.bound.eventStop);this.fireEvent("cancel",this.element);
}},stop:function(A){this.document.removeEvent(this.selection,this.bound.eventStop);this.document.removeEvent("mousemove",this.bound.drag);this.document.removeEvent("mouseup",this.bound.stop);
if(A){this.fireEvent("complete",this.element);}}});Element.implement({makeResizable:function(A){return new Drag(this,$merge({modifiers:{x:"width",y:"height"}},A));
}});Drag.Move=new Class({Extends:Drag,options:{droppables:[],container:false},initialize:function(C,B){this.parent(C,B);this.droppables=$$(this.options.droppables);
this.container=$(this.options.container);if(this.container&&$type(this.container)!="element"){this.container=$(this.container.getDocument().body);}C=this.element;
var D=C.getStyle("position");var A=(D!="static")?D:"absolute";if(C.getStyle("left")=="auto"||C.getStyle("top")=="auto"){C.position(C.getPosition(C.offsetParent));
}C.setStyle("position",A);this.addEvent("start",function(){this.checkDroppables();},true);},start:function(B){if(this.container){var D=this.element,J=this.container,E=J.getCoordinates(D.offsetParent),F={},A={};
["top","right","bottom","left"].each(function(K){F[K]=J.getStyle("padding-"+K).toInt();A[K]=D.getStyle("margin-"+K).toInt();},this);var C=D.offsetWidth+A.left+A.right,I=D.offsetHeight+A.top+A.bottom;
var H=[E.left+F.left,E.right-F.right-C];var G=[E.top+F.top,E.bottom-F.bottom-I];this.options.limit={x:H,y:G};}this.parent(B);},checkAgainst:function(B){B=B.getCoordinates();
var A=this.mouse.now;return(A.x>B.left&&A.x<B.right&&A.y<B.bottom&&A.y>B.top);},checkDroppables:function(){var A=this.droppables.filter(this.checkAgainst,this).getLast();
if(this.overed!=A){if(this.overed){this.fireEvent("leave",[this.element,this.overed]);}if(A){this.overed=A;this.fireEvent("enter",[this.element,A]);}else{this.overed=null;
}}},drag:function(A){this.parent(A);if(this.droppables.length){this.checkDroppables();}},stop:function(A){this.checkDroppables();this.fireEvent("drop",[this.element,this.overed]);
this.overed=null;return this.parent(A);}});Element.implement({makeDraggable:function(A){return new Drag.Move(this,A);}});Hash.Cookie=new Class({Extends:Cookie,options:{autoSave:true},initialize:function(B,A){this.parent(B,A);
this.load();},save:function(){var A=JSON.encode(this.hash);if(!A||A.length>4096){return false;}if(A=="{}"){this.dispose();}else{this.write(A);}return true;
},load:function(){this.hash=new Hash(JSON.decode(this.read(),true));return this;}});Hash.Cookie.implement((function(){var A={};Hash.each(Hash.prototype,function(C,B){A[B]=function(){var D=C.apply(this.hash,arguments);
if(this.options.autoSave){this.save();}return D;};});return A;})());var Color=new Native({initialize:function(B,C){if(arguments.length>=3){C="rgb";B=Array.slice(arguments,0,3);
}else{if(typeof B=="string"){if(B.match(/rgb/)){B=B.rgbToHex().hexToRgb(true);}else{if(B.match(/hsb/)){B=B.hsbToRgb();}else{B=B.hexToRgb(true);}}}}C=C||"rgb";
switch(C){case"hsb":var A=B;B=B.hsbToRgb();B.hsb=A;break;case"hex":B=B.hexToRgb(true);break;}B.rgb=B.slice(0,3);B.hsb=B.hsb||B.rgbToHsb();B.hex=B.rgbToHex();
return $extend(B,this);}});Color.implement({mix:function(){var A=Array.slice(arguments);var C=($type(A.getLast())=="number")?A.pop():50;var B=this.slice();
A.each(function(D){D=new Color(D);for(var E=0;E<3;E++){B[E]=Math.round((B[E]/100*(100-C))+(D[E]/100*C));}});return new Color(B,"rgb");},invert:function(){return new Color(this.map(function(A){return 255-A;
}));},setHue:function(A){return new Color([A,this.hsb[1],this.hsb[2]],"hsb");},setSaturation:function(A){return new Color([this.hsb[0],A,this.hsb[2]],"hsb");
},setBrightness:function(A){return new Color([this.hsb[0],this.hsb[1],A],"hsb");}});function $RGB(C,B,A){return new Color([C,B,A],"rgb");}function $HSB(C,B,A){return new Color([C,B,A],"hsb");
}function $HEX(A){return new Color(A,"hex");}Array.implement({rgbToHsb:function(){var B=this[0],C=this[1],J=this[2];var G,F,H;var I=Math.max(B,C,J),E=Math.min(B,C,J);
var K=I-E;H=I/255;F=(I!=0)?K/I:0;if(F==0){G=0;}else{var D=(I-B)/K;var A=(I-C)/K;var L=(I-J)/K;if(B==I){G=L-A;}else{if(C==I){G=2+D-L;}else{G=4+A-D;}}G/=6;
if(G<0){G++;}}return[Math.round(G*360),Math.round(F*100),Math.round(H*100)];},hsbToRgb:function(){var C=Math.round(this[2]/100*255);if(this[1]==0){return[C,C,C];
}else{var A=this[0]%360;var E=A%60;var F=Math.round((this[2]*(100-this[1]))/10000*255);var D=Math.round((this[2]*(6000-this[1]*E))/600000*255);var B=Math.round((this[2]*(6000-this[1]*(60-E)))/600000*255);
switch(Math.floor(A/60)){case 0:return[C,B,F];case 1:return[D,C,F];case 2:return[F,C,B];case 3:return[F,D,C];case 4:return[B,F,C];case 5:return[C,F,D];
}}return false;}});String.implement({rgbToHsb:function(){var A=this.match(/\d{1,3}/g);return(A)?hsb.rgbToHsb():null;},hsbToRgb:function(){var A=this.match(/\d{1,3}/g);
return(A)?A.hsbToRgb():null;}});var Group=new Class({initialize:function(){this.instances=Array.flatten(arguments);this.events={};this.checker={};},addEvent:function(B,A){this.checker[B]=this.checker[B]||{};
this.events[B]=this.events[B]||[];if(this.events[B].contains(A)){return false;}else{this.events[B].push(A);}this.instances.each(function(C,D){C.addEvent(B,this.check.bind(this,[B,C,D]));
},this);return this;},check:function(C,A,B){this.checker[C][B]=true;var D=this.instances.every(function(F,E){return this.checker[C][E]||false;},this);if(!D){return ;
}this.checker[C]={};this.events[C].each(function(E){E.call(this,this.instances,A);},this);}});var Asset=new Hash({javascript:function(F,D){D=$extend({onload:$empty,document:document,check:$lambda(true)},D);
var B=new Element("script",{src:F,type:"text/javascript"});var E=D.onload.bind(B),A=D.check,G=D.document;delete D.onload;delete D.check;delete D.document;
B.addEvents({load:E,readystatechange:function(){if(["loaded","complete"].contains(this.readyState)){E();}}}).setProperties(D);if(Browser.Engine.webkit419){var C=(function(){if(!$try(A)){return ;
}$clear(C);E();}).periodical(50);}return B.inject(G.head);},css:function(B,A){return new Element("link",$merge({rel:"stylesheet",media:"screen",type:"text/css",href:B},A)).inject(document.head);
},image:function(C,B){B=$merge({onload:$empty,onabort:$empty,onerror:$empty},B);var D=new Image();var A=$(D)||new Element("img");["load","abort","error"].each(function(E){var F="on"+E;
var G=B[F];delete B[F];D[F]=function(){if(!D){return ;}if(!A.parentNode){A.width=D.width;A.height=D.height;}D=D.onload=D.onabort=D.onerror=null;G.delay(1,A,A);
A.fireEvent(E,A,1);};});D.src=A.src=C;if(D&&D.complete){D.onload.delay(1);}return A.setProperties(B);},images:function(D,C){C=$merge({onComplete:$empty,onProgress:$empty},C);
if(!D.push){D=[D];}var A=[];var B=0;D.each(function(F){var E=new Asset.image(F,{onload:function(){C.onProgress.call(this,B,D.indexOf(F));B++;if(B==D.length){C.onComplete();
}}});A.push(E);});return new Elements(A);}});var Sortables=new Class({Implements:[Events,Options],options:{snap:4,opacity:1,clone:false,revert:false,handle:false,constrain:false},initialize:function(A,B){this.setOptions(B);
this.elements=[];this.lists=[];this.idle=true;this.addLists($$($(A)||A));if(!this.options.clone){this.options.revert=false;}if(this.options.revert){this.effect=new Fx.Morph(null,$merge({duration:250,link:"cancel"},this.options.revert));
}},attach:function(){this.addLists(this.lists);return this;},detach:function(){this.lists=this.removeLists(this.lists);return this;},addItems:function(){Array.flatten(arguments).each(function(A){this.elements.push(A);
var B=A.retrieve("sortables:start",this.start.bindWithEvent(this,A));(this.options.handle?A.getElement(this.options.handle)||A:A).addEvent("mousedown",B);
},this);return this;},addLists:function(){Array.flatten(arguments).each(function(A){this.lists.push(A);this.addItems(A.getChildren());},this);return this;
},removeItems:function(){var A=[];Array.flatten(arguments).each(function(B){A.push(B);this.elements.erase(B);var C=B.retrieve("sortables:start");(this.options.handle?B.getElement(this.options.handle)||B:B).removeEvent("mousedown",C);
},this);return $$(A);},removeLists:function(){var A=[];Array.flatten(arguments).each(function(B){A.push(B);this.lists.erase(B);this.removeItems(B.getChildren());
},this);return $$(A);},getClone:function(B,A){if(!this.options.clone){return new Element("div").inject(document.body);}if($type(this.options.clone)=="function"){return this.options.clone.call(this,B,A,this.list);
}return A.clone(true).setStyles({margin:"0px",position:"absolute",visibility:"hidden",width:A.getStyle("width")}).inject(this.list).position(A.getPosition(A.getOffsetParent()));
},getDroppables:function(){var A=this.list.getChildren();if(!this.options.constrain){A=this.lists.concat(A).erase(this.list);}return A.erase(this.clone).erase(this.element);
},insert:function(C,B){var A="inside";if(this.lists.contains(B)){this.list=B;this.drag.droppables=this.getDroppables();}else{A=this.element.getAllPrevious().contains(B)?"before":"after";
}this.element.inject(B,A);this.fireEvent("sort",[this.element,this.clone]);},start:function(B,A){if(!this.idle){return ;}this.idle=false;this.element=A;
this.opacity=A.get("opacity");this.list=A.getParent();this.clone=this.getClone(B,A);this.drag=new Drag.Move(this.clone,{snap:this.options.snap,container:this.options.constrain&&this.element.getParent(),droppables:this.getDroppables(),onSnap:function(){B.stop();
this.clone.setStyle("visibility","visible");this.element.set("opacity",this.options.opacity||0);this.fireEvent("start",[this.element,this.clone]);}.bind(this),onEnter:this.insert.bind(this),onCancel:this.reset.bind(this),onComplete:this.end.bind(this)});
this.clone.inject(this.element,"before");this.drag.start(B);},end:function(){this.drag.detach();this.element.set("opacity",this.opacity);if(this.effect){var A=this.element.getStyles("width","height");
var B=this.clone.computePosition(this.element.getPosition(this.clone.offsetParent));this.effect.element=this.clone;this.effect.start({top:B.top,left:B.left,width:A.width,height:A.height,opacity:0.25}).chain(this.reset.bind(this));
}else{this.reset();}},reset:function(){this.idle=true;this.clone.destroy();this.fireEvent("complete",this.element);},serialize:function(){var C=Array.link(arguments,{modifier:Function.type,index:$defined});
var B=this.lists.map(function(D){return D.getChildren().map(C.modifier||function(E){return E.get("id");},this);},this);var A=C.index;if(this.lists.length==1){A=0;
}return $chk(A)&&A>=0&&A<this.lists.length?B[A]:B;}});var Tips=new Class({Implements:[Events,Options],options:{onShow:function(A){A.setStyle("visibility","visible");
},onHide:function(A){A.setStyle("visibility","hidden");},showDelay:100,hideDelay:100,className:null,offsets:{x:16,y:16},fixed:false},initialize:function(){var C=Array.link(arguments,{options:Object.type,elements:$defined});
this.setOptions(C.options||null);this.tip=new Element("div").inject(document.body);if(this.options.className){this.tip.addClass(this.options.className);
}var B=new Element("div",{"class":"tip-top"}).inject(this.tip);this.container=new Element("div",{"class":"tip"}).inject(this.tip);var A=new Element("div",{"class":"tip-bottom"}).inject(this.tip);
this.tip.setStyles({position:"absolute",top:0,left:0,visibility:"hidden"});if(C.elements){this.attach(C.elements);}},attach:function(A){$$(A).each(function(D){var G=D.retrieve("tip:title",D.get("title"));
var F=D.retrieve("tip:text",D.get("rel")||D.get("href"));var E=D.retrieve("tip:enter",this.elementEnter.bindWithEvent(this,D));var C=D.retrieve("tip:leave",this.elementLeave.bindWithEvent(this,D));
D.addEvents({mouseenter:E,mouseleave:C});if(!this.options.fixed){var B=D.retrieve("tip:move",this.elementMove.bindWithEvent(this,D));D.addEvent("mousemove",B);
}D.store("tip:native",D.get("title"));D.erase("title");},this);return this;},detach:function(A){$$(A).each(function(C){C.removeEvent("mouseenter",C.retrieve("tip:enter")||$empty);
C.removeEvent("mouseleave",C.retrieve("tip:leave")||$empty);C.removeEvent("mousemove",C.retrieve("tip:move")||$empty);C.eliminate("tip:enter").eliminate("tip:leave").eliminate("tip:move");
var B=C.retrieve("tip:native");if(B){C.set("title",B);}});return this;},elementEnter:function(B,A){$A(this.container.childNodes).each(Element.dispose);
var D=A.retrieve("tip:title");if(D){this.titleElement=new Element("div",{"class":"tip-title"}).inject(this.container);this.fill(this.titleElement,D);}var C=A.retrieve("tip:text");
if(C){this.textElement=new Element("div",{"class":"tip-text"}).inject(this.container);this.fill(this.textElement,C);}this.timer=$clear(this.timer);this.timer=this.show.delay(this.options.showDelay,this);
this.position((!this.options.fixed)?B:{page:A.getPosition()});},elementLeave:function(A){$clear(this.timer);this.timer=this.hide.delay(this.options.hideDelay,this);
},elementMove:function(A){this.position(A);},position:function(D){var B=window.getSize(),A=window.getScroll();var E={x:this.tip.offsetWidth,y:this.tip.offsetHeight};
var C={x:"left",y:"top"};for(var F in C){var G=D.page[F]+this.options.offsets[F];if((G+E[F]-A[F])>B[F]){G=D.page[F]-this.options.offsets[F]-E[F];}this.tip.setStyle(C[F],G);
}},fill:function(A,B){(typeof B=="string")?A.set("html",B):A.adopt(B);},show:function(){this.fireEvent("show",this.tip);},hide:function(){this.fireEvent("hide",this.tip);
}});var SmoothScroll=new Class({Extends:Fx.Scroll,initialize:function(B,C){C=C||document;var E=C.getDocument(),D=C.getWindow();this.parent(E,B);this.links=(this.options.links)?$$(this.options.links):$$(E.links);
var A=D.location.href.match(/^[^#]*/)[0]+"#";this.links.each(function(G){if(G.href.indexOf(A)!=0){return ;}var F=G.href.substr(A.length);if(F&&$(F)){this.useLink(G,F);
}},this);if(!Browser.Engine.webkit419){this.addEvent("complete",function(){D.location.hash=this.anchor;},true);}},useLink:function(B,A){B.addEvent("click",function(C){this.anchor=A;
this.toElement(A);C.stop();}.bind(this));}});var Slider=new Class({Implements:[Events,Options],options:{onTick:function(A){if(this.options.snap){A=this.toPosition(this.step);
}this.knob.setStyle(this.property,A);},snap:false,offset:0,range:false,wheel:false,steps:100,mode:"horizontal"},initialize:function(E,A,D){this.setOptions(D);
this.element=$(E);this.knob=$(A);this.previousChange=this.previousEnd=this.step=-1;this.element.addEvent("mousedown",this.clickedElement.bind(this));if(this.options.wheel){this.element.addEvent("mousewheel",this.scrolledElement.bindWithEvent(this));
}var F,B={},C={x:false,y:false};switch(this.options.mode){case"vertical":this.axis="y";this.property="top";F="offsetHeight";break;case"horizontal":this.axis="x";
this.property="left";F="offsetWidth";}this.half=this.knob[F]/2;this.full=this.element[F]-this.knob[F]+(this.options.offset*2);this.min=$chk(this.options.range[0])?this.options.range[0]:0;
this.max=$chk(this.options.range[1])?this.options.range[1]:this.options.steps;this.range=this.max-this.min;this.steps=this.options.steps||this.full;this.stepSize=Math.abs(this.range)/this.steps;
this.stepWidth=this.stepSize*this.full/Math.abs(this.range);this.knob.setStyle("position","relative").setStyle(this.property,-this.options.offset);C[this.axis]=this.property;
B[this.axis]=[-this.options.offset,this.full-this.options.offset];this.drag=new Drag(this.knob,{snap:0,limit:B,modifiers:C,onDrag:this.draggedKnob.bind(this),onStart:this.draggedKnob.bind(this),onComplete:function(){this.draggedKnob();
this.end();}.bind(this)});if(this.options.snap){this.drag.options.grid=Math.ceil(this.stepWidth);this.drag.options.limit[this.axis][1]=this.full;}},set:function(A){if(!((this.range>0)^(A<this.min))){A=this.min;
}if(!((this.range>0)^(A>this.max))){A=this.max;}this.step=Math.round(A);this.checkStep();this.end();this.fireEvent("tick",this.toPosition(this.step));return this;
},clickedElement:function(C){var B=this.range<0?-1:1;var A=C.page[this.axis]-this.element.getPosition()[this.axis]-this.half;A=A.limit(-this.options.offset,this.full-this.options.offset);
this.step=Math.round(this.min+B*this.toStep(A));this.checkStep();this.end();this.fireEvent("tick",A);},scrolledElement:function(A){var B=(this.options.mode=="horizontal")?(A.wheel<0):(A.wheel>0);
this.set(B?this.step-this.stepSize:this.step+this.stepSize);A.stop();},draggedKnob:function(){var B=this.range<0?-1:1;var A=this.drag.value.now[this.axis];
A=A.limit(-this.options.offset,this.full-this.options.offset);this.step=Math.round(this.min+B*this.toStep(A));this.checkStep();},checkStep:function(){if(this.previousChange!=this.step){this.previousChange=this.step;
this.fireEvent("change",this.step);}},end:function(){if(this.previousEnd!==this.step){this.previousEnd=this.step;this.fireEvent("complete",this.step+"");
}},toStep:function(A){var B=(A+this.options.offset)*this.stepSize/this.full*this.steps;return this.options.steps?Math.round(B-=B%this.stepSize):B;},toPosition:function(A){return(this.full*Math.abs(this.min-A))/(this.steps*this.stepSize)-this.options.offset;
}});var Scroller=new Class({Implements:[Events,Options],options:{area:20,velocity:1,onChange:function(A,B){this.element.scrollTo(A,B);}},initialize:function(B,A){this.setOptions(A);
this.element=$(B);this.listener=($type(this.element)!="element")?$(this.element.getDocument().body):this.element;this.timer=null;this.coord=this.getCoords.bind(this);
},start:function(){this.listener.addEvent("mousemove",this.coord);},stop:function(){this.listener.removeEvent("mousemove",this.coord);this.timer=$clear(this.timer);
},getCoords:function(A){this.page=(this.listener.get("tag")=="body")?A.client:A.page;if(!this.timer){this.timer=this.scroll.periodical(50,this);}},scroll:function(){var B=this.element.getSize(),A=this.element.getScroll(),E=this.element.getPosition(),D={x:0,y:0};
for(var C in this.page){if(this.page[C]<(this.options.area+E[C])&&A[C]!=0){D[C]=(this.page[C]-this.options.area-E[C])*this.options.velocity;}else{if(this.page[C]+this.options.area>(B[C]+E[C])&&B[C]+B[C]!=A[C]){D[C]=(this.page[C]-B[C]+this.options.area-E[C])*this.options.velocity;
}}}if(D.y||D.x){this.fireEvent("change",[A.x+D.x,A.y+D.y]);}}});var Accordion=new Class({Extends:Fx.Elements,options:{display:0,show:false,height:true,width:false,opacity:true,fixedHeight:false,fixedWidth:false,wait:false,alwaysHide:false},initialize:function(){var C=Array.link(arguments,{container:Element.type,options:Object.type,togglers:$defined,elements:$defined});
this.parent(C.elements,C.options);this.togglers=$$(C.togglers);this.container=$(C.container);this.previous=-1;if(this.options.alwaysHide){this.options.wait=true;
}if($chk(this.options.show)){this.options.display=false;this.previous=this.options.show;}if(this.options.start){this.options.display=false;this.options.show=false;
}this.effects={};if(this.options.opacity){this.effects.opacity="fullOpacity";}if(this.options.width){this.effects.width=this.options.fixedWidth?"fullWidth":"offsetWidth";
}if(this.options.height){this.effects.height=this.options.fixedHeight?"fullHeight":"scrollHeight";}for(var B=0,A=this.togglers.length;B<A;B++){this.addSection(this.togglers[B],this.elements[B]);
}this.elements.each(function(E,D){if(this.options.show===D){this.fireEvent("active",[this.togglers[D],E]);}else{for(var F in this.effects){E.setStyle(F,0);
}}},this);if($chk(this.options.display)){this.display(this.options.display);}},addSection:function(E,C,G){E=$(E);C=$(C);var F=this.togglers.contains(E);
var B=this.togglers.length;this.togglers.include(E);this.elements.include(C);if(B&&(!F||G)){G=$pick(G,B-1);E.inject(this.togglers[G],"before");C.inject(E,"after");
}else{if(this.container&&!F){E.inject(this.container);C.inject(this.container);}}var A=this.togglers.indexOf(E);E.addEvent("click",this.display.bind(this,A));
if(this.options.height){C.setStyles({"padding-top":0,"border-top":"none","padding-bottom":0,"border-bottom":"none"});}if(this.options.width){C.setStyles({"padding-left":0,"border-left":"none","padding-right":0,"border-right":"none"});
}C.fullOpacity=1;if(this.options.fixedWidth){C.fullWidth=this.options.fixedWidth;}if(this.options.fixedHeight){C.fullHeight=this.options.fixedHeight;}C.setStyle("overflow","hidden");
if(!F){for(var D in this.effects){C.setStyle(D,0);}}return this;},display:function(A){A=($type(A)=="element")?this.elements.indexOf(A):A;if((this.timer&&this.options.wait)||(A===this.previous&&!this.options.alwaysHide)){return this;
}this.previous=A;var B={};this.elements.each(function(E,D){B[D]={};var C=(D!=A)||(this.options.alwaysHide&&(E.offsetHeight>0));this.fireEvent(C?"background":"active",[this.togglers[D],E]);
for(var F in this.effects){B[D][F]=C?0:E[this.effects[F]];}},this);return this.start(B);}});/* autogrow.js start *//*
 * SocialEngineMods Javascript Library Lite v0.1
 * http://www.SocialEngineMods.Net
 *
 * Copyright SocialEngineMods.Net
 * This code is licensed GPL for use exclusively on SocialEngine sites
 *
 */





/* Extensions */


Function.prototype.bind = function(obj) {
  var method = this, temp = function() {
    return method.apply(obj, arguments)
  };
  return(temp);
}; 


/* SEMods */


SEMods = function () {};

/* SEMods TextAreaControl */


SEMods.TextAreaControl = function(object) {
    this.obj = object;
    this.obj.style['overflow'] = 'hidden';
    this.originalHeight = this.obj.getStyle('height').toInt();
    var updater = this.update.bind(this);
    object.addEvent("focus", this.onFocus.bind(this));
    object.addEvent("blur", this.onBlur.bind(this));
    this.update();
};

SEMods.TextAreaControl.prototype = {
    obj : null,
    updating : false,
    autoGrow : false,
    originalHeight : null,
    shadowElement : null,
    increment : 0,
    timer : null,
    lastLength : 0,
    
    setAutoGrow : function(autoGrow) {
        this.autoGrow = autoGrow;
        this.createShadowElement();
        this.update();
    },
    
    onUpdate : function() {
        if(this.autoGrow && this.lastLength != this.obj.value.length) {
            this.lastLength = this.obj.value.length;
            this.updateShadowElement();
            this.obj.style.height = Math.max(this.originalHeight, this.shadowElement.offsetHeight + this.increment) + 'px';
        }
    },
    
    beginUpdate : function() {
        if(this.updating)
            return false;
        this.updating = true;
        return true;
    },
    
    endUpdate : function() {
        this.updating = false;
    },
    
    update : function() {
        if(!this.beginUpdate())
            return;
        
        this.onUpdate();
        this.endUpdate();
    },
    
    createShadowElement : function() {
        if(this.shadowElement)
            return;
        
        this.shadowElement = document.createElement("DIV");
        this.shadowElement.style.position = "absolute";
        this.shadowElement.style.top = "-99999px";
        this.shadowElement.style.left = "-99999px";
        
        document.body.appendChild(this.shadowElement);
    },
    
    updateShadowElement : function () {
        if(this.shadowElement) {
	    text = this.obj.value+'<br>';
            this.shadowElement.innerHTML = text.toString().replace(/&/g, '&amp;').replace(/"/g, '&quot;').replace(/'/g, '&#039;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\n/g, '<br />');
            var fontSize = this.getPXMetrics( this.obj.getStyle('font-size'), 10);
            var lineHeight = this.obj.getStyle('line-height');
            // Opera misses on line-height
            if((/Opera/i.test(navigator.userAgent))) 
              lineHeight = this.getPXMetrics( lineHeight, 0) + 3 + 'px';
              
            this.increment = fontSize + 10;
        
            this.shadowElement.style['width'] = this.obj.offsetWidth + 'px';
            this.shadowElement.style['lineHeight'] = lineHeight;
            this.shadowElement.style['fontSize'] = this.obj.getStyle('font-size');

            this.shadowElement.style['fontFamily'] = this.obj.getStyle('font-family');
            this.shadowElement.style['paddingLeft'] = this.obj.getStyle('padding-left');
            this.shadowElement.style['paddingRight'] = this.obj.getStyle('padding-right');
            
        } 
    },
    
    onFocus : function() {
      this.timer = setInterval(this.update.bind(this), 500);
    },
    
    onBlur : function() {
      if(this.timer) {
        clearInterval(this.timer);
        this.timer = null;
      }
    },

    // em's not supported for now
    getPXMetrics : function(metric, defvalue) {
      var metricBase = parseFloat(metric);
      if(isNaN(metricBase)) return defvalue!=null ? defvalue : metricBase;
      return /px/i.test(metric) ? metricBase : /pt/i.test(metric) ? 1.3333*metricBase  : metricBase;
    }
    
};


/* Global namespace helper functions */


function textarea_autogrow(elementid) {
    var el = $(elementid);
//    if(!el) alert("textarea_autogrow(): element not found");
    if(el && !el._controlled) {
        el._controlled = true;
        new SEMods.TextAreaControl(el).setAutoGrow(true);
	return el.getStyle('height').toInt();
    }
};
/* smoothbox.js start *//*
 * Smoothbox v20080623 by Boris Popoff (http://gueschla.com)
 * To be used with mootools 1.2
 *
 * Based on Cody Lindley's Thickbox, MIT License
 *
 * Licensed under the MIT License:
 *   http://www.opensource.org/licenses/mit-license.php
 */

// on page load call TB_init
window.addEvent('domready', TB_init);

// prevent javascript error before the content has loaded
TB_WIDTH = 0;
TB_HEIGHT = 0;
var TB_doneOnce = 0;

// add smoothbox to href elements that have a class of .smoothbox
function TB_init(){
	$$("a.smoothbox").each(function(el){el.onclick=TB_bind});
}

function TB_bind(event){
	var event = new Event(event);
	// stop default behaviour
	event.preventDefault();
	// remove click border
	this.blur();
	// get caption: either title or name attribute
	var caption = this.title || this.name || "";
	// get rel attribute for image groups
	var group = this.rel || false;
	// display the box for the elements href
	TB_show(caption, this.href, group);
    this.onclick = TB_bind;
    return false;
}

// called when the user clicks on a smoothbox link
function TB_show(caption, url, rel, loading, disable_close) {

  // set default closing mechanism
  if(!disable_close) { disable_close = 0; }

  // create iframe, overlay and box if non-existent
  if (!$("TB_overlay")) {
    new Element('div').setProperty('id', 'TB_overlay').inject(document.body);
    $('TB_overlay').setOpacity(0.6);
    TB_overlaySize();
  }

  if (!$("TB_window")) {
    new Element('div').setProperty('id', 'TB_window').inject(document.body);
    $('TB_window').setOpacity(0);
  }
  else 
  {
    $('TB_window').dispose();
    new Element('div').setProperty('id', 'TB_window').inject(document.body);
    $('TB_window').setOpacity(0);
  }

  if(disable_close == 0) { $("TB_overlay").onclick=TB_remove; } else { $("TB_overlay").onclick = ''; }
  window.onscroll = TB_position;
    
  // check if a query string is involved
  var baseURL = url.match(/(.+)?/)[1] || url;
    
  // CODE TO SHOW IFRAME
  var queryString = url.match(/\?(.+)/)[1];
  var params = TB_parseQuery(queryString);
        
  TB_WIDTH = (params['width'] * 1) + 30;
  TB_HEIGHT = (params['height'] * 1) + 40;
        
  var ajaxContentW = TB_WIDTH - 30, ajaxContentH = TB_HEIGHT - 45;

  if (url.indexOf('TB_iframe') != -1) {
    urlNoQuery = url.split('TB_');
    $("TB_window").innerHTML += "<div id='TB_title'><div id='TB_ajaxWindowTitle'>" + caption + "</div><div id='TB_closeAjaxWindow'><a href='#' id='TB_closeWindowButton' title='Close'>X</a></div></div><iframe frameborder='0' hspace='0' src='" + urlNoQuery[0] + "&in_smoothbox=true' id='TB_iframeContent' name='TB_iframeContent' scrolling='auto' style='width:" + (ajaxContentW + 29) + "px;height:" + (ajaxContentH + 17) + "px;' onload='TB_showWindow()'> </iframe>";
  }
  else {
    $("TB_window").innerHTML += "<div id='TB_title'><div id='TB_ajaxWindowTitle'>" + caption + "</div><div id='TB_closeAjaxWindow'><a href='#' id='TB_closeWindowButton'>X</a></div></div><div id='TB_ajaxContent' style='width:" + ajaxContentW + "px;height:" + ajaxContentH + "px;'></div>";
  }

  $("TB_closeWindowButton").onclick = TB_remove;

  if (url.indexOf('TB_inline') != -1) {
    $("TB_ajaxContent").innerHTML = ($(params['inlineId']).innerHTML);
    TB_position();
    TB_showWindow();
  } else if (url.indexOf('TB_iframe') != -1) {
    TB_position();
    if (frames['TB_iframeContent'] == undefined) {//be nice to safari
      $(document).keyup(function(e){
                    var key = e.keyCode;
                    if (key == 27) {
                        TB_remove()
                    }
      });
      TB_showWindow();
    }
  } else {
    var handlerFunc = function(){
          TB_position();
          TB_showWindow();
    };
    new Request.HTML({
                    method: 'get',
                    update: $("TB_ajaxContent"),
                    onComplete: handlerFunc
    }).get(url);
  }

  window.onresize = function(){
      TB_position();
      TB_overlaySize();
  }

  document.onkeyup = function(event){
      var event = new Event(event);
      if (event.code == 27) { // close
          TB_remove();
      }
  }


}

//helper functions below

function TB_showWindow(){

    if (TB_doneOnce == 0) {
        TB_doneOnce = 1;
        
        $('TB_window').set('tween', {
            duration: 250
        });
        $('TB_window').tween('opacity', 0, 1);
        
    }
    else {
        $('TB_window').setStyle('opacity', 1);
    }

//  $('TB_window').setStyle('opacity', 1);
}

function TB_remove(){
    $("TB_overlay").onclick = null;
    document.onkeyup = null;
    document.onkeydown = null;
    
    if ($('TB_closeWindowButton')) 
        $("TB_closeWindowButton").onclick = null;
    
    $('TB_window').set('tween', {
        duration: 250,
        onComplete: function(){
            $('TB_window').dispose();
        }
    });
    $('TB_window').tween('opacity', 1, 0);
    
    
    
    $('TB_overlay').set('tween', {
        duration: 400,
        onComplete: function(){
            $('TB_overlay').dispose();
        }
    });
    $('TB_overlay').tween('opacity', 0.6, 0);
    
    window.onscroll = null;
    window.onresize = null;
    
    TB_init();
    TB_doneOnce = 0;
    return false;
}

function TB_position(){
    $('TB_window').set('morph', {
        duration: 75
    });
    $('TB_window').morph({
		width: TB_WIDTH + 'px',
		left: (window.getScrollLeft() + (window.getWidth() - TB_WIDTH) / 2) + 'px',
		top: (window.getScrollTop() + (window.getHeight() - TB_HEIGHT) / 2) + 'px'
	});	
}

function TB_overlaySize(){
    // we have to set this to 0px before so we can reduce the size / width of the overflow onresize 
    $("TB_overlay").setStyles({
        "height": '0px',
        "width": '0px'
    });
    $("TB_overlay").setStyles({
        "height": window.getScrollHeight() + 'px',
        "width": window.getScrollWidth() + 'px'
    });
}


function TB_parseQuery(query){
    // return empty object
    if (!query) 
        return {};
    var params = {};
    
    // parse query
    var pairs = query.split(/[;&]/);
    for (var i = 0; i < pairs.length; i++) {
        var pair = pairs[i].split('=');
        if (!pair || pair.length != 2) 
            continue;
        // unescape both key and value, replace "+" with spaces in value
        params[unescape(pair[0])] = unescape(pair[1]).replace(/\+/g, ' ');
    }
    return params;
}
/* autosuggest.js start *//**
 *  author:		Timothy Groves - http://www.brandspankingnew.net
 *	version:	1.2 - 2006-11-17
 *              1.3 - 2006-12-04
 *              2.0 - 2007-02-07
 *              2.1.1 - 2007-04-13
 *              2.1.2 - 2007-07-07
 *              2.1.3 - 2007-07-19
 *
 */


if (typeof(bsn) == "undefined")
	_b = bsn = {};


if (typeof(_b.Autosuggest) == "undefined")
	_b.Autosuggest = {};
/*else
	alert("Autosuggest is already set!");*/












_b.AutoSuggest = function (id, param)
{
	// no DOM - give up!
	//
	if (!document.getElementById)
		return 0;
	
	
	
	
	// get field via DOM
	//
	this.fld = _b.DOM.gE(id);

	if (!this.fld)
		return 0;
	
	
	
	
	// init variables
	//
	this.sInp 	= "";
	this.nInpC 	= 0;
	this.aSug 	= [];
	this.iHigh 	= 0;
	
	
	
	
	// parameters object
	//
	this.oP = param ? param : {};
	
	// defaults	
	//
	var k, def = {minchars:1, meth:"get", varname:"input", className:"autosuggest", timeout:2500, delay:0, offsety:-5, shownoresults: true, noresults: "No results!", maxheight: 250, cache: true, maxentries: 25, blurtrigger: false, multisuggest: true};
	for (k in def)
	{
		if (typeof(this.oP[k]) != typeof(def[k]))
			this.oP[k] = def[k];
	}
	
	
	// set keyup handler for field
	// and prevent autocomplete from client
	//
	var p = this;
	
	// NOTE: not using addEventListener because UpArrow fired twice in Safari
	//_b.DOM.addEvent( this.fld, 'keyup', function(ev){ return pointer.onKeyPress(ev); } );
	
	this.fld.onkeypress 	= function(ev){ return p.onKeyPress(ev); };
	this.fld.onkeyup 	= function(ev){ return p.onKeyUp(ev); };
	if (typeof(this.oP.callback) == "function" && this.oP.blurtrigger) {
	  this.fld.onblur = function(event) { 
		if(document.activeElement && typeof(event) === "undefined") { 
			var targetFocus = document.activeElement;
		} else {
			var targetFocus = event.explicitOriginalTarget;
			while(targetFocus.parentNode) {
			  if(targetFocus.tagName == 'A' && typeof(targetFocus.id) == 'string') { if(targetFocus.id.substring(0, 10) == 'bsnsuggest') { break; } }
			  targetFocus = targetFocus.parentNode;
			}
			if(typeof(targetFocus.id) != 'string') { targetFocus.id = ''; }
		}
		if(targetFocus.id.substring(0, 10) != 'bsnsuggest') {
		  p.oP.callback( {id:p.fld.value, value: p.fld.value} ); 
		  p.clearSuggestions();
		}
	  }
	}
	
	this.fld.setAttribute("autocomplete","off");
};
















_b.AutoSuggest.prototype.onKeyPress = function(ev)
{
	
	var key = (window.event) ? window.event.keyCode : ev.keyCode;



	// set responses to keydown events in the field
	// this allows the user to use the arrow keys to scroll through the results
	// ESCAPE clears the list
	// TAB sets the current highlighted value
	//
	var RETURN = 13;
	var TAB = 9;
	var ESC = 27;
	var SEMICOLON = 186;
	
	var bubble = 1;

	switch(key)
	{
		case RETURN:
			if(this.aSug.length != 0 && this.iHigh) {
				this.setHighlightedValue();
				bubble = false;
			} else {
				if(this.fld.value.length > 0) {
					if (typeof(this.oP.callback) == "function") {
						this.clearSuggestions();
						this.oP.callback( {id:this.fld.value, value: this.fld.value} );
					}
					bubble = false;
				} else  {
					bubble = false;
				}
				
			}
			break;

		case ESC:
			this.clearSuggestions();
			break;
				
	}

	return bubble;
};



_b.AutoSuggest.prototype.onKeyUp = function(ev)
{
	var key = (window.event) ? window.event.keyCode : ev.keyCode;
	


	// set responses to keydown events in the field
	// this allows the user to use the arrow keys to scroll through the results
	// ESCAPE clears the list
	// TAB sets the current highlighted value
	//

	var ARRUP = 38;
	var ARRDN = 40;
	
	var bubble = 1;

	switch(key)
	{


		case ARRUP:
			this.changeHighlight(key);
			bubble = 0;
			break;


		case ARRDN:
			this.changeHighlight(key);
			bubble = 0;
			break;
		
		
		default:
			//this.getSuggestions(this.fld.value);
			// ADDED BY WEBLIGO
			var new_value = this.fld.value.split(/[;]+/ig);
			this.getSuggestions(new_value[new_value.length-1]);
	}

	return bubble;
	

};








_b.AutoSuggest.prototype.getSuggestions = function (val)
{
	
	// if input stays the same, do nothing
	//
	if (val == this.sInp)
		return 0;
	
	
	// kill list
	//
	_b.DOM.remE(this.idAs);
	
	
	this.sInp = val;
	
	
	// input length is less than the min required to trigger a request
	// do nothing
	//
	if (val.length < this.oP.minchars)
	{
		this.aSug = [];
		this.nInpC = val.length;
		return 0;
	}
	
	
	
	
	var ol = this.nInpC; // old length
	this.nInpC = val.length ? val.length : 0;
	
	
	
	// if caching enabled, and user is typing (ie. length of input is increasing)
	// filter results out of aSuggestions from last request
	//
	var l = this.aSug.length;
		if (this.nInpC > ol && l && l<this.oP.maxentries && this.oP.cache)
	{
		var arr = [];
		for (var i=0;i<l;i++)
		{
			if (this.aSug[i].value.substr(0,val.length).toLowerCase() == val.toLowerCase() || this.aSug[i].info.substr(0,val.length).toLowerCase() == val.toLowerCase()) {
				arr.push( this.aSug[i] );
			}
		}
		this.aSug = arr;
		
		// ADDED BY WEBLIGO
		if(this.aSug.length < l) {
			var pointer = this;
			var input = this.sInp;
			clearTimeout(this.ajID);
			this.ajID = setTimeout( function() { pointer.doAjaxRequest(input) }, this.oP.delay );
		} else {
			this.createList(this.aSug);
		}
		
		return false;
	}
	else
	// do new request
	//
	{
		var pointer = this;
		var input = this.sInp;
		clearTimeout(this.ajID);
		this.ajID = setTimeout( function() { pointer.doAjaxRequest(input) }, this.oP.delay );
	}

	return false;
};





_b.AutoSuggest.prototype.doAjaxRequest = function (input)
{
	// check that saved input is still the value of the field
	// CHANGED BY WEBLIGO
	var new_value = this.fld.value.split(/[;]+/ig);
	if (input != new_value[new_value.length-1])
		return false;
	
	
	
	var pointer = this;
	
	
	// create ajax request
	//
	if (typeof(this.oP.script) == "function")
		var url = this.oP.script(encodeURIComponent(this.sInp));
	else
		var url = this.oP.script+this.oP.varname+"="+encodeURIComponent(this.sInp);
	
	if (!url)
		return false;
	
	var meth = this.oP.meth;
	var input = this.sInp;
	
	var onSuccessFunc = function (req) { pointer.setSuggestions(req, input) };
	var onErrorFunc = function (status) {  };

	var myAjax = new _b.Ajax();
	myAjax.makeRequest( url, meth, onSuccessFunc, onErrorFunc );
};





_b.AutoSuggest.prototype.setSuggestions = function (req, input)
{
	// if field input no longer matches what was passed to the request
	// don't show the suggestions
	// CHANGED BY WEBLIGO
	var new_value = this.fld.value.split(/[;]+/ig);
	if (input != new_value[new_value.length-1])
		return false;
	
	this.aSug = [];
	
	
	if (this.oP.json)
	{
		var jsondata = eval('(' + req.responseText + ')');
		
		for (var i=0;i<jsondata.results.length;i++)
		{
			// CHANGED BY WEBLIGO
			this.aSug.push(  { 'id':jsondata.results[i].id, 'value':jsondata.results[i].value, 'info':jsondata.results[i].info, 'photo':jsondata.results[i].photo, 'photo_width':jsondata.results[i].photo_width }  );
		}
	}
	else
	{

		var xml = req.responseXML;
	
		// traverse xml
		//
		var results = xml.getElementsByTagName('results')[0].childNodes;

		for (var i=0;i<results.length;i++)
		{
			if (results[i].hasChildNodes())
				this.aSug.push(  { 'id':results[i].getAttribute('id'), 'value':results[i].childNodes[0].nodeValue, 'info':results[i].getAttribute('info') }  );
		}
	
	}
	
	this.idAs = "as_"+this.fld.id;
	

	this.createList(this.aSug);

};














_b.AutoSuggest.prototype.createList = function(arr)
{
	var pointer = this;
	
	
	
	
	// get rid of old list
	// and clear the list removal timeout
	//
	_b.DOM.remE(this.idAs);
	this.killTimeout();
	
	
	// if no results, and shownoresults is false, do nothing
	//
	if (arr.length == 0 && !this.oP.shownoresults) 
		return false;
	
	
	// create holding div
	//
	var div = _b.DOM.cE("div", {id:this.idAs, className:this.oP.className});	
	
	var hcorner = _b.DOM.cE("div", {className:"as_corner"});
	var hbar = _b.DOM.cE("div", {className:"as_bar"});
	var header = _b.DOM.cE("div", {className:"as_header"});
	header.appendChild(hcorner);
	header.appendChild(hbar);
	div.appendChild(header);
	
	
	
	
	// create and populate ul
	//
	var ul = _b.DOM.cE("ul", {id:"as_ul"});
	
	
	
	
	// loop throught arr of suggestions
	// creating an LI element for each suggestion
	//
	for (var i=0;i<arr.length;i++)
	{
		// format output with the input enclosed in a EM element
		// (as HTML, not DOM)
		//
		var val = arr[i].value;
		var val2 = arr[i].info;
		var st = val.toLowerCase().indexOf( this.sInp.toLowerCase() );
		var st2 = val2.toLowerCase().indexOf( this.sInp.toLowerCase() );
		
		if(st != -1) {
			var output = val.substring(0,st) + "<em>" + val.substring(st, st+this.sInp.length) + "</em>" + val.substring(st+this.sInp.length);
			var output2 = val2;
		} else {
			var output = val;
			var output2 = val2.substring(0,st2) + "<em>" + val2.substring(st, st2+this.sInp.length) + "</em>" + val2.substring(st2+this.sInp.length);
		}
		
		if (val != val2) {
			output = output2+" ("+output+")";
		}
		
		var span 		= _b.DOM.cE("span", {}, output, true);
		
		// CHANGED BY WEBLIGO
		var image		= _b.DOM.cE("img", {src:arr[i].photo, width: arr[i].photo_width, border:"0"});
		image.removeAttribute("height");
		span.insertBefore(image, span.childNodes[0]);

		var a 			= _b.DOM.cE("a", { href:"javascript:void(0);" });
		
		var tl 		= _b.DOM.cE("span", {className:"tl"}, " ");
		var tr 		= _b.DOM.cE("span", {className:"tr"}, " ");
		a.appendChild(tl);
		a.appendChild(tr);
		
		a.appendChild(span);
		
		a.name = i+1;
		a.id = 'bsnsuggest_'+(i+1);
		a.onclick = function () { pointer.setHighlightedValue(); return false; };
		a.onmouseover = function () { pointer.setHighlight(this.name); };
		
		var li = _b.DOM.cE(  "li", {}, a  );
		
		ul.appendChild( li );
	}
	
	
	// no results
	//
	if (arr.length == 0 && this.oP.shownoresults)
	{
		var li = _b.DOM.cE(  "li", {className:"as_warning"}, this.oP.noresults  );
		ul.appendChild( li );
	}
	
	
	div.appendChild( ul );
	
	var fcorner = _b.DOM.cE("div", {className:"as_corner"});
	var fbar = _b.DOM.cE("div", {className:"as_bar"});
	var footer = _b.DOM.cE("div", {className:"as_footer"});
	footer.appendChild(fcorner);
	footer.appendChild(fbar);
	div.appendChild(footer);
	
	
	
	// get position of target textfield
	// position holding div below it
	// set width of holding div to width of field
	//
	var pos = _b.DOM.getPos(this.fld);
	
	div.style.left 		= pos.x + "px";
	div.style.top 		= ( pos.y + this.fld.offsetHeight + this.oP.offsety ) + "px";
	div.style.width 	= this.fld.offsetWidth + "px";
	
	
	
	// set mouseover functions for div
	// when mouse pointer leaves div, set a timeout to remove the list after an interval
	// when mouse enters div, kill the timeout so the list won't be removed
	//
	div.onmouseover 	= function(){ pointer.killTimeout() };
	div.onmouseout 		= function(){ pointer.resetTimeout() };


	// add DIV to document
	//
	document.getElementsByTagName("body")[0].appendChild(div);
	
	
	
	// currently no item is highlighted
	//
	this.iHigh = 0;
	
	
	
	
	
	
	// remove list after an interval
	//
	var pointer = this;
	this.toID = setTimeout(function () { pointer.clearSuggestions() }, this.oP.timeout);
};















_b.AutoSuggest.prototype.changeHighlight = function(key)
{	
	var list = _b.DOM.gE("as_ul");
	if (!list)
		return false;
	
	var n;

	if (key == 40)
		n = this.iHigh + 1;
	else if (key == 38)
		n = this.iHigh - 1;
	
	
	if (n > list.childNodes.length)
		n = list.childNodes.length;
	if (n < 1)
		n = 1;
	
	
	this.setHighlight(n);
};



_b.AutoSuggest.prototype.setHighlight = function(n)
{
	var list = _b.DOM.gE("as_ul");
	if (!list)
		return false;
	
	if (this.iHigh > 0)
		this.clearHighlight();
	
	this.iHigh = Number(n);
	
	list.childNodes[this.iHigh-1].className = "as_highlight";


	this.killTimeout();
};


_b.AutoSuggest.prototype.clearHighlight = function()
{
	var list = _b.DOM.gE("as_ul");
	if (!list)
		return false;
	
	if (this.iHigh > 0)
	{
		list.childNodes[this.iHigh-1].className = "";
		this.iHigh = 0;
	}
};


_b.AutoSuggest.prototype.setHighlightedValue = function ()
{
	if (this.iHigh)
	{
		// CHANGED BY WEBLIGO
		var all_values = this.fld.value.split(/[;]+/ig);
		all_values.pop();
		all_values.push(this.aSug[ this.iHigh-1 ].value);
		if(this.oP['multisuggest']) { var semicolon = ';'; } else { var semicolon = ''; }
		this.sInp = this.fld.value = all_values.join(';')+semicolon;
		
		// move cursor to end of input (safari)
		//
		this.fld.focus();
		if (this.fld.selectionStart)
			this.fld.setSelectionRange(this.sInp.length, this.sInp.length);
		

		// pass selected object to callback function, if exists
		//
		if (typeof(this.oP.callback) == "function")
			this.oP.callback( this.aSug[this.iHigh-1] );
			
			
		this.clearSuggestions();
	}
};













_b.AutoSuggest.prototype.killTimeout = function()
{
	clearTimeout(this.toID);
};

_b.AutoSuggest.prototype.resetTimeout = function()
{
	clearTimeout(this.toID);
	var pointer = this;
	this.toID = setTimeout(function () { pointer.clearSuggestions() }, 1000);
};







_b.AutoSuggest.prototype.clearSuggestions = function ()
{
	
	this.killTimeout();
	this.aSug 	= [];
	var ele = _b.DOM.gE(this.idAs);
	var pointer = this;
	if (ele)
	{
		var fade = new _b.Fader(ele,1,0,250,function () { _b.DOM.remE(pointer.idAs) });
	}
};










// AJAX PROTOTYPE _____________________________________________


if (typeof(_b.Ajax) == "undefined")
	_b.Ajax = {};



_b.Ajax = function ()
{
	this.req = {};
	this.isIE = false;
};



_b.Ajax.prototype.makeRequest = function (url, meth, onComp, onErr)
{
	
	if (meth != "POST")
		meth = "GET";
	
	this.onComplete = onComp;
	this.onError = onErr;
	
	var pointer = this;
	
	// branch for native XMLHttpRequest object
	if (window.XMLHttpRequest)
	{
		this.req = new XMLHttpRequest();
		this.req.onreadystatechange = function () { pointer.processReqChange() };
		this.req.open("GET", url, true); //
		this.req.send(null);
	// branch for IE/Windows ActiveX version
	}
	else if (window.ActiveXObject)
	{
		this.req = new ActiveXObject("Microsoft.XMLHTTP");
		if (this.req)
		{
			this.req.onreadystatechange = function () { pointer.processReqChange() };
			this.req.open(meth, url, true);
			this.req.send();
		}
	}
};


_b.Ajax.prototype.processReqChange = function()
{
	
	// only if req shows "loaded"
	if (this.req.readyState == 4) {
		// only if "OK"
		if (this.req.status == 200)
		{
			this.onComplete( this.req );
		} else {
			this.onError( this.req.status );
		}
	}
};










// DOM PROTOTYPE _____________________________________________


if (typeof(_b.DOM) == "undefined")
	_b.DOM = {};



/* create element */
_b.DOM.cE = function ( type, attr, cont, html )
{
	var ne = document.createElement( type );
	if (!ne)
		return 0;
		
	
	for (var a in attr) 
		ne[a] = attr[a];

	var t = typeof(cont);
	
	if (t == "string" && !html)
		ne.appendChild( document.createTextNode(cont) );
	else if (t == "string" && html)
		ne.innerHTML = cont;
	else if (t == "object")
		ne.appendChild( cont );

	return ne;
};



/* get element */
_b.DOM.gE = function ( e )
{
	var t=typeof(e);
	if (t == "undefined")
		return 0;
	else if (t == "string")
	{
		var re = document.getElementById( e );
		if (!re)
			return 0;
		else if (typeof(re.appendChild) != "undefined" )
			return re;
		else
			return 0;
	}
	else if (typeof(e.appendChild) != "undefined")
		return e;
	else
		return 0;
};



/* remove element */
_b.DOM.remE = function ( ele )
{
	var e = this.gE(ele);
	
	if (!e)
		return 0;
	else if (e.parentNode.removeChild(e))
		return true;
	else
		return 0;
};



/* get position */
_b.DOM.getPos = function ( e )
{
	var e = this.gE(e);

	var obj = e;

	var curleft = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curleft += obj.offsetLeft;
			obj = obj.offsetParent;
		}
	}
	else if (obj.x)
		curleft += obj.x;
	
	var obj = e;
	
	var curtop = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curtop += obj.offsetTop;
			obj = obj.offsetParent;
		}
	}
	else if (obj.y)
		curtop += obj.y;

	return {x:curleft, y:curtop};
};










// FADER PROTOTYPE _____________________________________________



if (typeof(_b.Fader) == "undefined")
	_b.Fader = {};





_b.Fader = function (ele, from, to, fadetime, callback)
{	
	if (!ele)
		return 0;
	
	this.e = ele;
	
	this.from = from;
	this.to = to;
	
	this.cb = callback;
	
	this.nDur = fadetime;
		
	this.nInt = 50;
	this.nTime = 0;
	
	var p = this;
	this.nID = setInterval(function() { p._fade() }, this.nInt);
};




_b.Fader.prototype._fade = function()
{
	this.nTime += this.nInt;
	
	var ieop = Math.round( this._tween(this.nTime, this.from, this.to, this.nDur) * 100 );
	var op = ieop / 100;
	
	if (this.e.filters) // internet explorer
	{
		try
		{
			this.e.filters.item("DXImageTransform.Microsoft.Alpha").opacity = ieop;
		} catch (e) { 
			// If it is not set initially, the browser will throw an error.  This will set it if it is not set yet.
			this.e.style.filter = 'progid:DXImageTransform.Microsoft.Alpha(opacity='+ieop+')';
		}
	}
	else // other browsers
	{
		this.e.style.opacity = op;
	}
	
	
	if (this.nTime == this.nDur)
	{
		clearInterval( this.nID );
		if (this.cb != undefined)
			this.cb();
	}
};



_b.Fader.prototype._tween = function(t,b,c,d)
{
	return b + ( (c-b) * (t/d) );
};/* sprintf.js start *//**
 * sprintf() for JavaScript v.0.4
 *
 * Copyright (c) 2007 Alexandru Marasteanu <http://alexei.417.ro/>
 * Thanks to David Baird (unit test and patch).
 *
 * This program is free software; you can redistribute it and/or modify it under
 * the terms of the GNU General Public License as published by the Free Software
 * Foundation; either version 2 of the License, or (at your option) any later
 * version.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
 * details.
 *
 * You should have received a copy of the GNU General Public License along with
 * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
 * Place, Suite 330, Boston, MA 02111-1307 USA
 */

function str_repeat(i, m) { for (var o = []; m > 0; o[--m] = i); return(o.join('')); }

function sprintf()
{
  var i = 0, a, f = arguments[i++], o = [], m, p, c, x;
  while (f) {
    if (m = /^[^\x25]+/.exec(f)) o.push(m[0]);
    else if (m = /^\x25{2}/.exec(f)) o.push('%');
    else if (m = /^\x25(?:(\d+)\$)?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-fosuxX])/.exec(f)) {
      if (((a = arguments[m[1] || i++]) == null) || (a == undefined)) throw("Too few arguments.");
      if (/[^s]/.test(m[7]) && (typeof(a) != 'number'))
        throw("Expecting number but found " + typeof(a));
      switch (m[7]) {
        case 'b': a = a.toString(2); break;
        case 'c': a = String.fromCharCode(a); break;
        case 'd': a = parseInt(a); break;
        case 'e': a = m[6] ? a.toExponential(m[6]) : a.toExponential(); break;
        case 'f': a = m[6] ? parseFloat(a).toFixed(m[6]) : parseFloat(a); break;
        case 'o': a = a.toString(8); break;
        case 's': a = ((a = String(a)) && m[6] ? a.substring(0, m[6]) : a); break;
        case 'u': a = Math.abs(a); break;
        case 'x': a = a.toString(16); break;
        case 'X': a = a.toString(16).toUpperCase(); break;
      }
      a = (/[def]/.test(m[7]) && m[2] && a > 0 ? '+' + a : a);
      c = m[3] ? m[3] == '0' ? '0' : m[3].charAt(1) : ' ';
      x = m[5] - String(a).length;
      p = m[5] ? str_repeat(c, x) : '';
      o.push(m[4] ? a + p : p + a);
    }
    else throw ("Huh ?!");
    f = f.substring(m[0].length);
  }
  return o.join('');
}
/* tabber.js start *//*==================================================
  $Id: tabber.js,v 1.9 2006/04/27 20:51:51 pat Exp $
  tabber.js by Patrick Fitzgerald pat@barelyfitz.com

  Documentation can be found at the following URL:
  http://www.barelyfitz.com/projects/tabber/

  License (http://www.opensource.org/licenses/mit-license.php)

  Copyright (c) 2006 Patrick Fitzgerald

  Permission is hereby granted, free of charge, to any person
  obtaining a copy of this software and associated documentation files
  (the "Software"), to deal in the Software without restriction,
  including without limitation the rights to use, copy, modify, merge,
  publish, distribute, sublicense, and/or sell copies of the Software,
  and to permit persons to whom the Software is furnished to do so,
  subject to the following conditions:

  The above copyright notice and this permission notice shall be
  included in all copies or substantial portions of the Software.

  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
  BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
  ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  SOFTWARE.
  ==================================================*/

function tabberObj(argsObj)
{
  var arg; /* name of an argument to override */

  /* Element for the main tabber div. If you supply this in argsObj,
     then the init() method will be called.
  */
  this.div = null;

  /* Class of the main tabber div */
  this.classMain = "tabber";

  /* Rename classMain to classMainLive after tabifying
     (so a different style can be applied)
  */
  this.classMainLive = "tabberlive";

  /* Class of each DIV that contains a tab */
  this.classTab = "tabbertab";

  /* Class to indicate which tab should be active on startup */
  this.classTabDefault = "tabbertabdefault";

  /* Class for the navigation UL */
  this.classNav = "tabbernav";

  /* When a tab is to be hidden, instead of setting display='none', we
     set the class of the div to classTabHide. In your screen
     stylesheet you should set classTabHide to display:none.  In your
     print stylesheet you should set display:block to ensure that all
     the information is printed.
  */
  this.classTabHide = "tabbertabhide";

  /* Class to set the navigation LI when the tab is active, so you can
     use a different style on the active tab.
  */
  this.classNavActive = "tabberactive";

  /* Elements that might contain the title for the tab, only used if a
     title is not specified in the TITLE attribute of DIV classTab.
  */
  this.titleElements = ['h2','h3','h4','h5','h6'];

  /* Should we strip out the HTML from the innerHTML of the title elements?
     This should usually be true.
  */
  this.titleElementsStripHTML = true;

  /* If the user specified the tab names using a TITLE attribute on
     the DIV, then the browser will display a tooltip whenever the
     mouse is over the DIV. To prevent this tooltip, we can remove the
     TITLE attribute after getting the tab name.
  */
  this.removeTitle = true;

  /* If you want to add an id to each link set this to true */
  this.addLinkId = false;

  /* If addIds==true, then you can set a format for the ids.
     <tabberid> will be replaced with the id of the main tabber div.
     <tabnumberzero> will be replaced with the tab number
       (tab numbers starting at zero)
     <tabnumberone> will be replaced with the tab number
       (tab numbers starting at one)
     <tabtitle> will be replaced by the tab title
       (with all non-alphanumeric characters removed)
   */
  this.linkIdFormat = '<tabberid>nav<tabnumberone>';

  /* You can override the defaults listed above by passing in an object:
     var mytab = new tabber({property:value,property:value});
  */
  for (arg in argsObj) { this[arg] = argsObj[arg]; }

  /* Create regular expressions for the class names; Note: if you
     change the class names after a new object is created you must
     also change these regular expressions.
  */
  this.REclassMain = new RegExp('\\b' + this.classMain + '\\b', 'gi');
  this.REclassMainLive = new RegExp('\\b' + this.classMainLive + '\\b', 'gi');
  this.REclassTab = new RegExp('\\b' + this.classTab + '\\b', 'gi');
  this.REclassTabDefault = new RegExp('\\b' + this.classTabDefault + '\\b', 'gi');
  this.REclassTabHide = new RegExp('\\b' + this.classTabHide + '\\b', 'gi');

  /* Array of objects holding info about each tab */
  this.tabs = new Array();

  /* If the main tabber div was specified, call init() now */
  if (this.div) {

    this.init(this.div);

    /* We don't need the main div anymore, and to prevent a memory leak
       in IE, we must remove the circular reference between the div
       and the tabber object. */
    this.div = null;
  }
}


/*--------------------------------------------------
  Methods for tabberObj
  --------------------------------------------------*/


tabberObj.prototype.init = function(e)
{
  /* Set up the tabber interface.

     e = element (the main containing div)

     Example:
     init(document.getElementById('mytabberdiv'))
   */

  var
  childNodes, /* child nodes of the tabber div */
  i, i2, /* loop indices */
  t, /* object to store info about a single tab */
  defaultTab=0, /* which tab to select by default */
  DOM_ul, /* tabbernav list */
  DOM_li, /* tabbernav list item */
  DOM_a, /* tabbernav link */
  aId, /* A unique id for DOM_a */
  headingElement; /* searching for text to use in the tab */

  /* Verify that the browser supports DOM scripting */
  if (!document.getElementsByTagName) { return false; }

  /* If the main DIV has an ID then save it. */
  if (e.id) {
    this.id = e.id;
  }

  /* Clear the tabs array (but it should normally be empty) */
  this.tabs.length = 0;

  /* Loop through an array of all the child nodes within our tabber element. */
  childNodes = e.childNodes;
  for(i=0; i < childNodes.length; i++) {

    /* Find the nodes where class="tabbertab" */
    if(childNodes[i].className &&
       childNodes[i].className.match(this.REclassTab)) {
      
      /* Create a new object to save info about this tab */
      t = new Object();
      
      /* Save a pointer to the div for this tab */
      t.div = childNodes[i];
      
      /* Add the new object to the array of tabs */
      this.tabs[this.tabs.length] = t;

      /* If the class name contains classTabDefault,
	 then select this tab by default.
      */
      if (childNodes[i].className.match(this.REclassTabDefault)) {
	defaultTab = this.tabs.length-1;
      }
    }
  }

  /* Create a new UL list to hold the tab headings */
  DOM_ul = document.createElement("ul");
  DOM_ul.className = this.classNav;
  
  /* Loop through each tab we found */
  for (i=0; i < this.tabs.length; i++) {

    t = this.tabs[i];

    /* Get the label to use for this tab:
       From the title attribute on the DIV,
       Or from one of the this.titleElements[] elements,
       Or use an automatically generated number.
     */
    t.headingText = t.div.title;

    /* Remove the title attribute to prevent a tooltip from appearing */
    if (this.removeTitle) { t.div.title = ''; }

    if (!t.headingText) {

      /* Title was not defined in the title of the DIV,
	 So try to get the title from an element within the DIV.
	 Go through the list of elements in this.titleElements
	 (typically heading elements ['h2','h3','h4'])
      */
      for (i2=0; i2<this.titleElements.length; i2++) {
	headingElement = t.div.getElementsByTagName(this.titleElements[i2])[0];
	if (headingElement) {
	  t.headingText = headingElement.innerHTML;
	  if (this.titleElementsStripHTML) {
	    t.headingText.replace(/<br>/gi," ");
	    t.headingText = t.headingText.replace(/<[^>]+>/g,"");
	  }
	  break;
	}
      }
    }

    if (!t.headingText) {
      /* Title was not found (or is blank) so automatically generate a
         number for the tab.
      */
      t.headingText = i + 1;
    }

    /* Create a list element for the tab */
    DOM_li = document.createElement("li");

    /* Save a reference to this list item so we can later change it to
       the "active" class */
    t.li = DOM_li;

    /* Create a link to activate the tab */
    DOM_a = document.createElement("a");
    DOM_a.appendChild(document.createTextNode(t.headingText));
    DOM_a.href = "javascript:void(null);";
    DOM_a.title = t.headingText;
    DOM_a.onclick = this.navClick;

    /* Add some properties to the link so we can identify which tab
       was clicked. Later the navClick method will need this.
    */
    DOM_a.tabber = this;
    DOM_a.tabberIndex = i;

    /* Do we need to add an id to DOM_a? */
    if (this.addLinkId && this.linkIdFormat) {

      /* Determine the id name */
      aId = this.linkIdFormat;
      aId = aId.replace(/<tabberid>/gi, this.id);
      aId = aId.replace(/<tabnumberzero>/gi, i);
      aId = aId.replace(/<tabnumberone>/gi, i+1);
      aId = aId.replace(/<tabtitle>/gi, t.headingText.replace(/[^a-zA-Z0-9\-]/gi, ''));

      DOM_a.id = aId;
    }

    /* Add the link to the list element */
    DOM_li.appendChild(DOM_a);

    /* Add the list element to the list */
    DOM_ul.appendChild(DOM_li);
  }

  /* Add the UL list to the beginning of the tabber div */
  e.insertBefore(DOM_ul, e.firstChild);

  /* Make the tabber div "live" so different CSS can be applied */
  e.className = e.className.replace(this.REclassMain, this.classMainLive);

  /* Activate the default tab, and do not call the onclick handler */
  this.tabShow(defaultTab);

  /* If the user specified an onLoad function, call it now. */
  if (typeof this.onLoad == 'function') {
    this.onLoad({tabber:this});
  }

  return this;
};


tabberObj.prototype.navClick = function(event)
{
  /* This method should only be called by the onClick event of an <A>
     element, in which case we will determine which tab was clicked by
     examining a property that we previously attached to the <A>
     element.

     Since this was triggered from an onClick event, the variable
     "this" refers to the <A> element that triggered the onClick
     event (and not to the tabberObj).

     When tabberObj was initialized, we added some extra properties
     to the <A> element, for the purpose of retrieving them now. Get
     the tabberObj object, plus the tab number that was clicked.
  */

  var
  rVal, /* Return value from the user onclick function */
  a, /* element that triggered the onclick event */
  self, /* the tabber object */
  tabberIndex, /* index of the tab that triggered the event */
  onClickArgs; /* args to send the onclick function */

  a = this;
  if (!a.tabber) { return false; }

  self = a.tabber;
  tabberIndex = a.tabberIndex;

  /* Remove focus from the link because it looks ugly.
     I don't know if this is a good idea...
  */
  a.blur();

  /* If the user specified an onClick function, call it now.
     If the function returns false then do not continue.
  */
  if (typeof self.onClick == 'function') {

    onClickArgs = {'tabber':self, 'index':tabberIndex, 'event':event};

    /* IE uses a different way to access the event object */
    if (!event) { onClickArgs.event = window.event; }

    rVal = self.onClick(onClickArgs);
    if (rVal === false) { return false; }
  }

  self.tabShow(tabberIndex);

  return false;
};


tabberObj.prototype.tabHideAll = function()
{
  var i; /* counter */

  /* Hide all tabs and make all navigation links inactive */
  for (i = 0; i < this.tabs.length; i++) {
    this.tabHide(i);
  }
};


tabberObj.prototype.tabHide = function(tabberIndex)
{
  var div;

  if (!this.tabs[tabberIndex]) { return false; }

  /* Hide a single tab and make its navigation link inactive */
  div = this.tabs[tabberIndex].div;

  /* Hide the tab contents by adding classTabHide to the div */
  if (!div.className.match(this.REclassTabHide)) {
    div.className += ' ' + this.classTabHide;
  }
  this.navClearActive(tabberIndex);

  return this;
};


tabberObj.prototype.tabShow = function(tabberIndex)
{
  /* Show the tabberIndex tab and hide all the other tabs */

  var div;

  if (!this.tabs[tabberIndex]) { return false; }

  /* Hide all the tabs first */
  this.tabHideAll();

  /* Get the div that holds this tab */
  div = this.tabs[tabberIndex].div;

  /* Remove classTabHide from the div */
  div.className = div.className.replace(this.REclassTabHide, '');

  /* Mark this tab navigation link as "active" */
  this.navSetActive(tabberIndex);

  /* If the user specified an onTabDisplay function, call it now. */
  if (typeof this.onTabDisplay == 'function') {
    this.onTabDisplay({'tabber':this, 'index':tabberIndex});
  }

  return this;
};

tabberObj.prototype.navSetActive = function(tabberIndex)
{
  /* Note: this method does *not* enforce the rule
     that only one nav item can be active at a time.
  */

  /* Set classNavActive for the navigation list item */
  this.tabs[tabberIndex].li.className = this.classNavActive;

  return this;
};


tabberObj.prototype.navClearActive = function(tabberIndex)
{
  /* Note: this method does *not* enforce the rule
     that one nav should always be active.
  */

  /* Remove classNavActive from the navigation list item */
  this.tabs[tabberIndex].li.className = '';

  return this;
};


/*==================================================*/


function tabberAutomatic(tabberArgs)
{
  /* This function finds all DIV elements in the document where
     class=tabber.classMain, then converts them to use the tabber
     interface.

     tabberArgs = an object to send to "new tabber()"
  */
  var
    tempObj, /* Temporary tabber object */
    divs, /* Array of all divs on the page */
    i; /* Loop index */

  if (!tabberArgs) { tabberArgs = {}; }

  /* Create a tabber object so we can get the value of classMain */
  tempObj = new tabberObj(tabberArgs);

  /* Find all DIV elements in the document that have class=tabber */

  /* First get an array of all DIV elements and loop through them */
  divs = document.getElementsByTagName("div");
  for (i=0; i < divs.length; i++) {
    
    /* Is this DIV the correct class? */
    if (divs[i].className &&
	divs[i].className.match(tempObj.REclassMain)) {
      
      /* Now tabify the DIV */
      tabberArgs.div = divs[i];
      divs[i].tabber = new tabberObj(tabberArgs);
    }
  }
  
  return this;
}


/*==================================================*/


function tabberAutomaticOnLoad(tabberArgs)
{
  /* This function adds tabberAutomatic to the window.onload event,
     so it will run after the document has finished loading.
  */
  var oldOnLoad;

  if (!tabberArgs) { tabberArgs = {}; }

  /* Taken from: http://simon.incutio.com/archive/2004/05/26/addLoadEvent */

  oldOnLoad = window.onload;
  if (typeof window.onload != 'function') {
    window.onload = function() {
      tabberAutomatic(tabberArgs);
    };
  } else {
    window.onload = function() {
      oldOnLoad();
      tabberAutomatic(tabberArgs);
    };
  }
}


/*==================================================*/


/* Run tabberAutomaticOnload() unless the "manualStartup" option was specified */

if (typeof tabberOptions == 'undefined') {

    tabberAutomaticOnLoad();

} else {

  if (!tabberOptions['manualStartup']) {
    tabberAutomaticOnLoad(tabberOptions);
  }

}
/* album_tag.js start */

var newtag;
var current_user;
var isTagging = false;
var tags = [];


// THIS FUNCTION CREATES A NEW TAGGING INSTANCE
function addTag() {
  if(!isTagging) {
    isTagging = true;
    newtag = new MooCrop('media_photo');

    var indicator = $('media_photo_tagform').inject(newtag.wrapper);
    indicator.setStyles({'top' : newtag.crop.bottom+10, 'left' : newtag.crop.right+10, 'display' : 'block'});

    newtag.addEvent('onBegin', function(imgsrc, crop, bound, hanlde) { indicator.setStyle('display', 'none'); });
    newtag.addEvent('onCrop', function(imgsrc, crop, bound, hanlde) { indicator.setStyles({'top' : crop.bottom+10, 'left' : crop.right+10, 'display' : 'none'}); });
    newtag.addEvent('onComplete', function(imgsrc, crop, bound, hanlde) { indicator.setStyle('display', 'block'); });
  }
}

// THIS FUNCTION CANCELS THE TAGGING INSTANCE
function cancelTag() {
  if(isTagging) {
    $('media_photo_tag').value = '';
    $('media_photo_tagform').inject('media_photo_div').setStyle('display', 'none');
    var stopTagging = newtag.removeOverlay.bind(newtag);
    stopTagging();
    isTagging = false;
  }
}

// THIS FUNCTION ATTEMPTS TO SAVE A NEW TAG
function saveTag(owner_username, album_id, media_id, mediatag_user_id) {
  if(isTagging) {

    var url = 'album_file.php?task=tag&user='+owner_username;
    url += '&album_id='+album_id;
    url += '&media_id='+media_id;
    url += '&mediatag_user_id='+mediatag_user_id;
    url += '&mediatag_text='+encodeURIComponent($('media_photo_tag').value);
    url += '&mediatag_x='+newtag.crop.top;
    url += '&mediatag_y='+newtag.crop.left;
    url += '&mediatag_height='+newtag.crop.height;
    url += '&mediatag_width='+newtag.crop.width;
    $('ajaxframe').src = url;

    $('media_photo_tag').value = '';
    $('media_photo_tagform').inject('media_photo_div').setStyle('display', 'none');
    var stopTagging = newtag.removeOverlay.bind(newtag);
    stopTagging();
    isTagging = false;
  }
}

// THIS FUNCTION CONSTRUCTS A NEW TAG ONCE CREATION IS CONFIRMED
function insertTag(tag_id, tag_link, tag_text, tag_x, tag_y, tag_width, tag_height, owner_username, album_id, media_id, tagged_user) {

  var newHTML = '';

  if($('media_tags').style.display == 'none') {
    $('media_tags').style.display = 'block';
  } else if(tags.length != 0) {
    newHTML = '<span id="tag_comma_'+tag_id+'">, </span>';
  }

  var newSpan = new Element("span", {'id' : 'full_tag_'+tag_id, 'html' : newHTML});
  if(tag_link != '') {
    var newAnchor = new Element("a", {'href' : tag_link, 
			'id' : 'tag_link_'+tag_id,
			'html' : tag_text
		}).inject(newSpan);
  } else {
    var newAnchor = new Element("span", {'id' : 'tag_link_'+tag_id,
				'html' : tag_text,
				'styles' : {'cursor' : 'pointer'}
			}).inject(newSpan);
  }

  if(current_user == tagged_user || current_user == owner_username) {
    var media_tags_text = $(newSpan).get('html');
    $(newSpan).set('html', media_tags_text, ' (<a href=\'javascript:void(0);\' id=\'new_removetag_link\'>'+SELanguage.Translate(1000173)+'</a>)');
  }

  newSpan.inject($('media_tags'));

  createTag(tag_id, tag_text, tag_x, tag_y, tag_width, tag_height);

  $('tag_link_'+tag_id).addEvent('mouseover', function() { showTag(tag_id); });
  $('tag_link_'+tag_id).addEvent('mouseout', function() { hideTag(tag_id); });

  if($('new_removetag_link')) {
    $('new_removetag_link').addEvent('click', function() { removeTag(tag_id, owner_username, album_id, media_id); });
    $('new_removetag_link').set('id', 'removetag_link_'+tag_id);
  }

  tags.push(tag_id);

}


// THIS FUNCTION CREATES A TAG FOR LATER VIEWING
function createTag(tag_id, label_text, tag_x, tag_y, tag_width, tag_height) {

  // CREATE TAG AND LABEL
  new Element("div", {'id' : 'tag_'+tag_id, 'html' : '<img src="./images/trans.gif" width="100%" height="100%" />', 'class' : 'tag_div_hidden', 'styles' : {'width' : (parseInt(tag_width)-4)+'px', 'height' : (parseInt(tag_height)-4)+'px', 'top' : tag_x+'px', 'left' : tag_y+'px'}}).inject($('media_photo_div'));
  new Element("div", {'id' : 'tag_label_'+tag_id, 'html' : label_text, 'class' : 'tag_label', 'styles' : {'display' : 'none', 'top' : (parseInt(tag_x)+parseInt(tag_height)+10)+'px', 'left' : tag_y+'px'}}).inject($('media_photo_div'));

  // ADD MOUSEOVER/MOUSEOUT EVENTS
  $('tag_'+tag_id).addEvent('mouseover', function() { showTag(tag_id); });
  $('tag_'+tag_id).addEvent('mouseout', function() { hideTag(tag_id); });
}

// THIS FUNCTION DISPLAYS A TAG
function showTag(tag_id) {
  $('tag_'+tag_id).className = 'tag_div';
  $('tag_label_'+tag_id).style.display = 'block';
}

// THIS FUNCTION HIDES A TAG FROM VIEW
function hideTag(tag_id) {
  $('tag_'+tag_id).className = 'tag_div_hidden';
  $('tag_label_'+tag_id).style.display = 'none';
}


// THIS FUNCTION REMOVES A TAG COMPLETELY
function removeTag(tag_id, owner_username, album_id, media_id) {

  var url = 'album_file.php?task=tag_remove&user='+owner_username;
  url += '&album_id='+album_id;
  url += '&media_id='+media_id;
  url += '&mediatag_id='+tag_id;
  $('ajaxframe').src = url;

  $('tag_'+tag_id).destroy();
  $('tag_label_'+tag_id).destroy();

  $('full_tag_'+tag_id).destroy();

  if(tags.indexOf(tag_id) == 0 && $('tag_comma_'+tags[1])) {
    $('tag_comma_'+tags[1]).destroy();
  }

  tags.splice(tags.indexOf(tag_id), 1);

  if(tags.length == 0) {
    $('media_tags').style.display = 'none';
  }
}


// THIS FUNCTION SENDS A JSON REQUEST FOR THE FRIENDLIST
function getFriendList(owner_username, album_id, media_id) {
  var request = new Request.JSON({secure: false, url: 'misc_js.php?task=friends_all',
		onComplete: function(jsonObj) { 
			addFriendToList(jsonObj.friends, owner_username, album_id, media_id);
		}
  }).send();
}


// THIS FUNCTION TAKES A JSON RESULT AND POPULATES THE FRIENDLIST
function addFriendToList(friends, owner_username, album_id, media_id) {
  if($('media_photo_friendlist')) {
    friends.each(function(friend) {
      for(var x in friend) {

	var newDiv = new Element("div", {'id' : 'friend_div_'+x});
	var newAnchor = new Element("a", {'href' : 'javascript:void(0)', 
			'id' : 'friend_link_'+x,
			'html' : friend[x]
		}).inject(newDiv);

	newDiv.inject($('media_photo_friendlist'));

	$('friend_link_'+x).addEvent('click', function() { saveTag(owner_username, album_id, media_id, x); });
      }
    });
  }
}





/***
 * MooCrop (v. rc-1 - 2007-10-24 )
 *
 * @version			rc-1
 * @license			BSD-style license
 * @author			nwhite - < nw [at] nwhite.net >
 * @infos			http://www.nwhite.net/MooCrop/
 * @copyright		Author
 * 

 */
var MooCrop = new Class({

	calculateHandles : true,
	current : {},

	options : {
		maskColor : 'black',
		maskOpacity : '.3',
		handleColor : '#FFFFFF',
		handleWidth : '5px',
		handleHeight : '5px',
		cropBorder : '1px dashed #FFFFFF',
		min : { 'width' : 50, 'height' : 50 },
		showMask : true, // false to remove, helps on slow machines
		showHandles : false // hide handles on drag
	},

	initialize: function(el, options){
		this.setOptions(options);
		this.img = $(el);
		if ( this.img.get('tag') != 'img') return false;

		this.resizeFunc = this.refresh.bindWithEvent(this);
		this.removeFunc = this.removeListener.bind(this);

		this.buildOverlay();
		this.setup();
	},

	setup: function(){
		$(this.cropArea).setStyles({
			'width': this.options.min.width, 
			'height': this.options.min.height,
			'top' : (this.img.height - this.options.min.height)/2,
			'left': (this.img.width - this.options.min.width) / 2 
		});

		this.current.crop = this.crop = this.getCropArea();
		this.handleWidthOffset = this.options.handleWidth.toInt() / 2;
		this.handleHeightOffset = this.options.handleHeight.toInt() /2;

		this.fixBoxModel();
		this.drawMasks();
		this.positionHandles();
	},

	getCropArea : function(){
		var crop = this.cropArea.getCoordinates();
		crop.left -= this.offsets.x; crop.right -= this.offsets.x; // calculate relative (horizontal)
		crop.top -= this.offsets.y; crop.bottom  -= this.offsets.y; // calculate relative (vertical)
		return crop;
	},

	fixBoxModel : function(){
		var diff = this.boxDiff = (this.crop.width - this.options.min.width)/2;

		var b = this.bounds = { 'top' : diff, 'left' : diff, 
			'right' : this.img.width+(diff*2), 'bottom' : this.img.height+(diff*2),
			'width' : this.options.min.width+(diff*2), 'height' : this.options.min.height+(diff*2) };

		this.wrapper.setStyles({
			'width' : b.right, 'height' : b.bottom,
			'background' : 'url('+this.img.src+') no-repeat '+diff+'px '+diff+'px'
		});

		this.north.setStyle('width',b.right);
		this.south.setStyle('width',b.right);
	},

	activate : function(event,handle){
		event.stop();
		this.current = { 'x' : event.page.x, 'y' : event.page.y, 'handle' : handle, 'crop' : this.current.crop };
		if(this.current.handle == 'NESW' && !this.options.showHandles) this.hideHandles();
		this.fireEvent('onBegin',[this.img.src,this.getCropInfo(),this.bounds,handle]);
		document.addEvent('mousemove', this.resizeFunc);
		document.addEvent('mouseup', this.removeFunc);
	},

	removeListener : function(){
		if( this.current.handle == 'NESW' && !this.options.showHandles) this.showHandles();
		document.removeEvent('mousemove', this.resizeFunc);
		document.removeEvent('mouseup', this.removeFunc);
		this.crop = this.current.crop;
		this.fireEvent('onComplete',[this.img.src,this.getCropInfo(),this.bounds,this.current.handle]);
	},

	refresh : function(event){
		var xdiff = this.current.x - event.page.x;
		var ydiff = this.current.y - event.page.y;

		var b = this.bounds;  var c = this.crop;  var handle = this.current.handle; var styles = {}; //saving bytes
		var dragging = (handle.length > 2) ? true : false;
		
		if( handle.contains("S") ){//SOUTH
			if(c.bottom - ydiff > b.bottom ) ydiff = c.bottom - b.bottom; // box south
			if(!dragging){
				if( (c.height - ydiff) < b.height ) ydiff = c.height - b.height; // size south
				styles['height'] = c.height - ydiff; // South handles only
			}
		}
		if( handle.contains("N") ){//NORTH
			if(c.top - ydiff < b.top ) ydiff = c.top; //box north
			if(!dragging){
				if( (c.height + ydiff ) < b.height ) ydiff = b.height - c.height; // size north
				styles['height'] = c.height + ydiff; // North handles only
			}
			styles['top'] = c.top - ydiff; // both Drag and N handles
		}
		if( handle.contains("E") ){//EAST
			if(c.right - xdiff > b.right) xdiff = c.right - b.right; //box east
			if(!dragging){
				if( (c.width - xdiff) < b.width ) xdiff = c.width - b.width; // size east
				styles['width'] = c.width - xdiff;
			}
		}
		if( handle.contains("W") ){//WEST
			if(c.left - xdiff < b.left) xdiff = c.left; //box west
			if(!dragging){
				if( (c.width + xdiff) < b.width ) xdiff = b.width - c.width; //size west
				styles['width'] = c.width + xdiff;
			}
			styles['left'] = c.left - xdiff; // both Drag and W handles
		}
		var preCssStyles = $merge(styles);
		if( $defined(styles.width)) styles.width -= this.boxDiff*2;
		if( $defined(styles.height)) styles.height -= this.boxDiff*2;

		this.cropArea.setStyles(styles);
		this.getCurrentCoords(preCssStyles);
		this.drawMasks();
		this.positionHandles();
		this.fireEvent('onCrop',[this.img.src,this.getCropInfo(),b,handle]);
	},

	getCurrentCoords : function(changed){
		var current = $merge(this.crop);
		
		if($defined(changed.left)){
			current.left = changed.left;
			if($defined(changed.width)) current.width = changed.width;
			else current.right = current.left + current.width;
		}
		if($defined(changed.top)){
			current.top = changed.top;
			if($defined(changed.height)) current.height = changed.height;
			else current.bottom = current.top + current.height;
		}
		if($defined(changed.width) && !$defined(changed.left)){
			current.width = changed.width; current.right = current.left + current.width;
		}
		if($defined(changed.height) && !$defined(changed.top)){
			current.height = changed.height; current.bottom = current.top + current.height;
		}
		this.current.crop = current;
	},

	drawMasks : function(){
		if(!this.options.showMask) return;
		var b = this.bounds;  var c = this.current.crop; var handle = this.current.handle;

		this.north.setStyle('height', c.top + 'px' );
		this.south.setStyle('height', b.bottom  - c.bottom  + 'px');
		this.east.setStyles({ height: c.height + 'px', width: b.right  - c.right + 'px',  top: c.top  + 'px', left: c.right + 'px'});
		this.west.setStyles({ height: c.height + 'px', width: c.left + 'px', top: c.top + 'px'});
	},

	positionHandles: function(){
		if(!this.calculateHandles) return;
		var c = this.current.crop; var wOffset = this.handleWidthOffset; var hOffset = this.handleHeightOffset;

		this.handles.get('N').setStyles({'left' : c.width / 2 - wOffset + 'px', 'top' : - hOffset + 'px'});
		this.handles.get('NE').setStyles({'left' : c.width - wOffset + 'px', 'top' : - hOffset + 'px'});
		this.handles.get('E').setStyles({ 'left' : c.width - wOffset + 'px', 'top' : c.height / 2 - hOffset + 'px'});
		this.handles.get('SE').setStyles({'left' : c.width - wOffset + 'px', 'top' : c.height - hOffset + 'px'});
		this.handles.get('S').setStyles({'left' : c.width / 2 - wOffset + 'px', 'top' : c.height - hOffset + 'px'});
		this.handles.get('SW').setStyles({'left' : - wOffset + 'px', 'top' : c.height - hOffset + 'px'});
		this.handles.get('W').setStyles({'left' : - wOffset + 'px', 'top' : c.height / 2 - hOffset + 'px'});
		this.handles.get('NW').setStyles({'left' : - wOffset + 'px', 'top' : - hOffset + 'px'});
	},

	hideHandles: function(){
		this.calculateHandles = false;
		this.handles.each(function(handle){
			handle.setStyle('display','none');
		});
	},

	showHandles: function(){
		this.calculateHandles = true;
		this.positionHandles();
		this.handles.each(function(handle){
			handle.setStyle('display','block');
		});
	},

	buildOverlay: function(){
		var o = this.options;

		this.wrapper = new Element("div", {
			'styles' : {'z-index' : 100, 'position' : 'relative', 'width' : this.img.width, 'height' : this.img.height, 'background' : 'url('+this.img.src+') no-repeat' , 'float' : this.img.getStyle('float') , 'margin-left' : 'auto' , 'margin-right' : 'auto'  }
		}).injectBefore(this.img);

		this.img.setStyle('display','none');

		this.offsets = { x : this.wrapper.getLeft(), y : this.wrapper.getTop() };

		// SET WRAPPER MOUSEOVER TO STOP PROPAGATION OF MOUSEOVER EVENT
		this.wrapper.addEvent('mouseover', function(event) { return false; });

		if(this.options.showMask){		// optional masks
			var maskStyles = { 'position' : 'absolute', 'overflow' : 'hidden', 'background-color' : o.maskColor, 'opacity' : o.maskOpacity};
			this.north = new Element("div", {'styles' : $merge(maskStyles,{'left':'0px'})}).injectInside(this.wrapper);
			this.south = new Element("div", {'styles' : $merge(maskStyles,{'bottom':'0px', 'left':'0px'})}).injectInside(this.wrapper);
			this.east =  new Element("div", {'styles' : maskStyles}).injectInside(this.wrapper);
			this.west =  new Element("div", {'styles' : $merge(maskStyles,{'left':'0px'})}).injectInside(this.wrapper);
		}

		this.cropArea = new Element("div", { 'styles' : { 'position' : 'absolute', 'top' : '0px', 'left' : '0px', 'border' : o.cropBorder, 'cursor' : 'move' },
		'events' : {
			'dblclick' : function(){ this.fireEvent('onDblClk',[this.img.src,this.getCropInfo(),this.bounds])}.bind(this),
			'mousedown' : this.activate.bindWithEvent(this,'NESW')}
		}).injectInside(this.wrapper);

		this.handles = new Hash();
		['N','NE','E','SE','S','SW','W','NW'].each(function(handle){
			this.handles.set(handle, new Element("div", {
			'styles' : { 'position' : 'absolute', 'background-color' : o.handleColor, 
						 'width' : o.handleWidth, 'height' : o.handleHeight, 'overflow' : 'hidden', 'cursor' : (handle.toLowerCase()+'-resize')},
			'events' : {'mousedown' : this.activate.bindWithEvent(this,handle)}
			}).injectInside(this.cropArea));
		},this);
	},

	getCropInfo : function(){
		var c = $merge(this.current.crop);
		c.width -= this.boxDiff*2; c.height -= this.boxDiff*2;
		return c;
	},

	removeOverlay: function(){
		this.wrapper.destroy();
		this.img.setStyle('display','');
	}

});
MooCrop.implement(new Events, new Options);/* twitter.js start */
Element.implement({
	sep_t_show: function() {
		this.setStyle('display','');
	},
	sep_t_hide: function() {
		this.setStyle('display','none');
	},
	sep_t_visible: function() {
		if(this.getStyle('display') == 'none') {
			return false;	
		}
		else {
			return true;
		}	
	},
	sep_t_toggle: function() {
		if(this.getStyle('display') == 'none') {
			this.sep_nfa_show();
		}
		else {
			this.sep_nfa_hide();
		}				
	},
	sep_t_update: function(html) {
		this.innerHTML = html;
	}
});	    
   
   
function SEP_Twitter_friendships_create(screen_name, ajax_spinner, update_div) { 	
	$(ajax_spinner).sep_t_show();
		
	myreq2 = new Request({
		method: 'post',
		url: './user_twitter_ajax.php',
		data: '_ajaxReq=1&task=friendships_create&screen_name='+screen_name,
		onComplete: function() { $(ajax_spinner).sep_t_hide(); },
		onSuccess: function(html){ $(update_div).sep_t_update(html); },
		onFailure: function() { alert('Error! Please try again later!'); }
	}).send();	 			
}

function SEP_Twitter_friendships_destroy(screen_name, ajax_spinner, update_div) { 		
	$(ajax_spinner).sep_t_show();
	
	myreq2 = new Request({
		method: 'post',
		url: './user_twitter_ajax.php',
		data: '_ajaxReq=1&task=friendships_destroy&screen_name='+screen_name,
		onComplete: function() { $(ajax_spinner).sep_t_hide(); },
		onSuccess: function(html){ $(update_div).sep_t_update(html); },
		onFailure: function() { alert('Error! Please try again later!'); }
	}).send();	 			
}


function SEP_Twitter_favorites_create(id, elm) {
	elm.src = './images/icons/twitter_icon_throbber.gif';
	
	myreq2 = new Request({
		method: 'post',
		url: './user_twitter_ajax.php',
		data: '_ajaxReq=1&task=favorites_create&id='+id,
		onSuccess: function(){ elm.src = './images/icons/twitter_icon_star_full.gif'; 
								if(Browser.Engine.trident) { /* work-around for IE */ elm.style.visibility = 'visible';	}
								else { elm.setStyle('visibility', 'visible'); }
								elm.onclick = function(){ SEP_Twitter_favorites_destroy(id, elm) } },
		onFailure: function() { elm.src = './images/icons/twitter_icon_star_empty.gif'; alert('Error! Please try again later!'); }
	}).send();		
}


function SEP_Twitter_favorites_destroy(id, elm) {	
	elm.src = './images/icons/twitter_icon_throbber.gif';
	
	myreq2 = new Request({
		method: 'post',
		url: './user_twitter_ajax.php',
		data: '_ajaxReq=1&task=favorites_destroy&id='+id,
		onSuccess: function(){ elm.src = './images/icons/twitter_icon_star_empty.gif'; 
								if(Browser.Engine.trident) { /* work-around for IE */ elm.style.visibility = '';	}
								else { elm.setStyle('visibility', ''); }
								elm.onclick = function(){ SEP_Twitter_favorites_create(id, elm) } },
		onFailure: function() { elm.src = './images/icons/twitter_icon_star_full.gif'; alert('Error! Please try again later!'); }
	}).send();		
}

function SEP_Twitter_statuses_destroy(id, elm, recordRow) {	
	elm.src = './images/icons/twitter_icon_throbber.gif';

	if(Browser.Engine.trident) { /* work-around for IE */ elm.style.visibility = 'visible';	}
	else { elm.setStyle('visibility', 'visible'); }
	
	if(!window.confirm('Are you sure you want to delete this tweet?')) {
		elm.src = './images/icons/twitter_icon_trash.gif';
		if(Browser.Engine.trident) { /* work-around for IE */ elm.style.visibility = '';	}
		else { elm.setStyle('visibility', ''); }		
		return false;	
	}	
	
	myreq2 = new Request({
		method: 'post',
		url: './user_twitter_ajax.php',
		data: '_ajaxReq=1&task=statuses_destroy&id='+id,
		onSuccess: function(){ $(recordRow).destroy(); },
		onFailure: function() { elm.src = './images/icons/twitter_icon_trash.gif'; 
								if(Browser.Engine.trident) { /* work-around for IE */ elm.style.visibility = '';	}
								else { elm.setStyle('visibility', ''); }				
								alert('Error! Please try again later!'); }
	}).send();		
}





function SEP_Twitter_NextPage(div, page, tpl, instance_name, owner_id, twitter_q) {
	$(div+'_'+page+'_spinner').sep_t_show();
	
	if(owner_id == null) {
		owner_id = '';
	}
	myreq2 = new Request({
		method: 'post',
		url: './user_twitter_ajax.php',
		data: '_ajaxReq=1&task=next_page&tpl='+tpl+'&instance_name='+instance_name+'&page='+page+'&user_id='+owner_id+'&twitter_q='+twitter_q,
		onSuccess: function(html){ $(div+'_'+page).sep_t_update(html); },
		onFailure: function() { alert('Error! Please try again later!'); }
	}).send();	
}




var SEP_Twitter_Tweet = new Class({
	initialize: function(tweet_form) {
		this.timer = null;
		
		this.max_characters = 140;
		
		this.tweet_form = $(tweet_form);
		
		this.link = $(tweet_form+'_Link');
		this.textarea = this.tweet_form.getElement('textarea');	
		this.in_reply_to_status_id = this.tweet_form.getElements('input')[0];
		this.submit = this.tweet_form.getElements('input')[1];
		this.sending_div = this.tweet_form.getElement('div.SEP_Twitter_Tweet_Sending');
		this.success_div = this.tweet_form.getElement('div.SEP_Twitter_Tweet_Success');		
		this.form_div = this.tweet_form.getElement('div.SEP_Twitter_Tweet_Form');	
		this.counter = this.tweet_form.getElement('div.SEP_Twitter_Tweet_Characters_Counter');
		this.heading = this.tweet_form.getElement('span.SEP_Twitter_Tweet_Heading');
	},
	
	start: function() {
		this.check();
		this.timer = this.check.bind(this).periodical(300);
	},
	
	stop: function() {
		$clear(this.timer);
	},
	
	check: function() {
		// check max length
		counter = this.max_characters - this.textarea.value.length;
		if(counter < 10) {
			this.counter.addClass('counterNegative');
		}
		else {
			this.counter.removeClass('counterNegative');			
		}
		this.counter.sep_t_update(counter);
		
		// hide submit button?
		if(counter < 0) {
			this.submit.sep_t_hide();	
		}
		else {
			this.submit.sep_t_show();				
		}
		
		// check heading
		if(this.textarea.value.charAt(0) == '@') {
			this.heading.sep_t_update('Reply to tweet ...');
			this.submit.value = 'Reply';
		}
		else {
			this.heading.sep_t_update('What are you doing?');
			this.submit.value = 'Update';			
		}
	},
	
	show_form: function() {
		this.check();
		this.link.sep_t_hide();		
		this.sending_div.sep_t_hide();
		this.success_div.sep_t_hide();
		this.tweet_form.sep_t_show();
		this.form_div.sep_t_show();		
	},
	
	show_sending: function() {
		this.link.sep_t_hide();		
		this.success_div.sep_t_hide();
		this.form_div.sep_t_hide();	
		this.tweet_form.sep_t_show();		
		this.sending_div.sep_t_show();				
	},
	show_success: function() {
		this.link.sep_t_hide();
		this.sending_div.sep_t_hide();
		this.form_div.sep_t_hide();	
		this.tweet_form.sep_t_show();		
		this.success_div.sep_t_show();				
	},
	show_link: function() {
		this.sending_div.sep_t_hide();
		this.form_div.sep_t_hide();	
		this.success_div.sep_t_hide();			
		this.tweet_form.sep_t_hide();		
		this.link.sep_t_show();		
		this.reset();
	},
	
	
	send: function() {
		// check max length
		if(this.max_characters - this.textarea.value.length < 0) {
			return false;	
		} 	
		
		this.show_sending();
		
		myreq2 = new Request({
			method: 'post',
			url: './user_twitter_ajax.php',
			data: '_ajaxReq=1&task=statuses_update&'+this.tweet_form.toQueryString(),
			onSuccess: function() { this.reset(); this.stop(); this.show_success(); }.bind(this),
			onFailure: function() { this.show_form(); alert('Error! Please try again later!'); }.bind(this)
		}).send();	
			
	},
	
	reset: function() {
		this.textarea.value = '';
		this.check();	
	}
	
});


function SEP_Twitter_reply(id, screen_name, tweet_obj) {
	if(tweet_obj) {
		tweet_obj.textarea.value = '@'+screen_name+' ';
		tweet_obj.in_reply_to_status_id.value = id;
		tweet_obj.check();	
		tweet_obj.show_form();
		tweet_obj.textarea.focus();

		// scroll to textarea
		offset = 500;
		div_position_y = tweet_obj.tweet_form.getPosition().y;
		window.scrollTo(0, div_position_y-offset);		
		
	}
}

/* video.js start */function import_form_submit(playlist_id)
{
	form_name = "import_form_" + playlist_id;
	document.forms[form_name].submit();
}

var SocialEngineVideo = new Class({
  
  options: {
    'ajaxURL' : 'video_ajax.php'
  },
  
  
  sortablesEffect: null,
  
  
  currentConfirmDeleteID: 0,
  
  
  
  initialize: function()
  {
    var bind = this;
    window.addEvent('domready', function()
    {
      if( !$$('.seVideoRow').length ) return;
      
      bind.sortablesEffect = new Sortables($$('.userVideoList'),
      {
        constrain: true,
        clone: false,
        revert: true,
        handle: '.seVideoMoveHandle',
        opacity: 0.6
      });
      
      bind.sortablesEffect.addEvent('complete', function()
      {
        bind.sendFullVideoOrder();
      });
      
    });
  },
  
  
  // Move Up
  moveUpVideo: function(videoID)
  {
    // Ajax
    var request = new Request.JSON({
      'method' : 'post',
      'url' : this.options.ajaxURL,
      'data' : {
        'task' : 'moveupvideo',
        'video_id' : videoID
      },
      'onComplete':function(responseObject)
      {
        if( $type(responseObject)!="object" || !responseObject.result || responseObject.result=="failure" )
        {
          //alert('There was an error processing your move request.');
        }
      }
    });
    
    request.send();
    
    // Switch the element's order.
    var videoContainer = $('seVideo_' + videoID);
    var previousContainer = videoContainer.getPrevious();
    videoContainer.inject(previousContainer, 'before');
    
    // Make it so the first one can't move up
    this.refreshMoveUpButtons();
  },
  
  
  sendFullVideoOrder: function()
  {
    var isFirst = true;
    var order = '';
    $$('.seVideoRow').each(function(videoRowElement)
    {
      var videoID = videoRowElement.getElement('.seVideoID').getProperty('html');
      if( !isFirst ) order += ',';
      order += videoID;
      isFirst = false;
    });
    
    // Ajax
    var request = new Request.JSON({
      'method' : 'post',
      'url' : this.options.ajaxURL,
      'data' : {
        'task' : 'reordervideo',
        'video_order' : order
      },
      'onComplete':function(responseObject)
      {
        if( $type(responseObject)!="object" || !responseObject.result || responseObject.result=="failure" )
        {
          //alert('There was an error processing your move request.');
        }
      }
    });
    
    request.send();
    
    // Make it so the first one can't move up
    this.refreshMoveUpButtons();
  },
  
  
  refreshMoveUpButtons: function()
  {
    /*
    var isFirst = true;
    $$('.seVideoRow').each(function(rowElement)
    {
      if( isFirst )
      {
        rowElement.getElement('.seVideoMoveUp').style.display = 'none';
        rowElement.getElement('.seVideoMoveDisabled').style.display = '';
      }
      else
      {
        rowElement.getElement('.seVideoMoveUp').style.display = '';
        rowElement.getElement('.seVideoMoveDisabled').style.display = 'none';
      }
      isFirst = false;
    });
    */
  },
  
  
  
  // Delete
  deleteVideo: function(videoID)
  {
    // Display
    this.currentConfirmDeleteID = videoID;
    TB_show(SELanguage.Translate(4000038), '#TB_inline?height=100&width=300&inlineId=confirmvideodelete', '', '../images/trans.gif');
  },
  
  deleteVideoConfirm: function(videoID)
  {
    // Ajax
    var request = new Request.JSON({
      'method' : 'post',
      'url' : this.options.ajaxURL,
      'data' : {
        'task' : 'deletevideo',
        'video_id' : videoID
      },
      'onComplete':function(responseObject)
      {
        if( $type(responseObject)!="object" || !responseObject.result || responseObject.result=="failure" )
        {
          //alert('There was an error processing your delete request.');
        }
      }
    });
    
    request.send();
    
    // Destroy
    if( this.sortablesEffect )
      this.sortablesEffect.removeItems($('seVideo_' + videoID));
    
    $('seVideo_' + videoID).destroy();
    
    this.refreshMoveUpButtons();
  },
  
  
  
  // Editing
  editVideoTitle: function(videoID)
  {
    // Get title
    var videoTitleContainer = $('seVideo_' + videoID);
    var videoTitle = videoTitleContainer.getElement('.seVideoTitle').getProperty('html');
    
    // Set title
    var videoTitleInput = videoTitleContainer.getElement('.seVideoTitleEditor').getElement('input');
    videoTitleInput.setProperty('value', videoTitle);
    
    // Display
    this.showVideoTitleEditor(videoID);
    
    // Focus
    videoTitleInput.focus();
    videoTitleInput.select();
  },
  
  saveVideoTitle: function(videoID)
  {
    // Get title
    var videoTitleContainer = $('seVideo_' + videoID);
    var videoTitle = videoTitleContainer.getElement('.seVideoTitleEditor').getElement('input').getProperty('value');
    
    // Ajax
    var request = new Request.JSON({
      'method' : 'post',
      'url' : this.options.ajaxURL,
      'data' : {
        'task' : 'editvideotitle',
        'video_id' : videoID,
        'video_title' : videoTitle
      },
      'onComplete':function(responseObject)
      {
        if( $type(responseObject)!="object" || !responseObject.result || responseObject.result=="failure" )
        {
          //alert('There was an error processing your edit request.');
        }
      }
    });
    
    request.send();
    
    // Set title
    videoTitleContainer.getElement('.seVideoTitle').setProperty('html', videoTitle);
    
    // Display
    this.hideVideoTitleEditor(videoID);
  },
  
  cancelVideoTitle: function(videoID)
  {
    // Display
    this.hideVideoTitleEditor(videoID);
  },
  
  showVideoTitleEditor: function(videoID)
  {
    var videoTitleContainer = $('seVideo_' + videoID);
    
    videoTitleContainer.getElement('.seVideoTitle').style.display = 'none';
    videoTitleContainer.getElement('.seVideoTitleEdit').style.display = 'none';
    
    videoTitleContainer.getElement('.seVideoTitleEditor').style.display = '';
    videoTitleContainer.getElement('.seVideoTitleSave').style.display = '';
    videoTitleContainer.getElement('.seVideoTitleCancel').style.display = '';
  },
  
  hideVideoTitleEditor: function(videoID)
  {
    var videoTitleContainer = $('seVideo_' + videoID);
    
    videoTitleContainer.getElement('.seVideoTitle').style.display = '';
    videoTitleContainer.getElement('.seVideoTitleEdit').style.display = '';
    
    videoTitleContainer.getElement('.seVideoTitleEditor').style.display = 'none';
    videoTitleContainer.getElement('.seVideoTitleSave').style.display = 'none';
    videoTitleContainer.getElement('.seVideoTitleCancel').style.display = 'none';
  }

});/* class_link.js start */
function rc_link_vote(link_id, vote)
{
   //$('link_vote_up_' + link_id).onmouseout = null;
   
   var request = new Request.JSON({
      'url' : 'user_link_vote.php',
      'method' : 'post',
      'secure' : false,
      'data' : {
        'task'  : 'dovote_ajax',
        'link_id'  : link_id,
        'vote' : vote
      },
      'onComplete' : function(responseObject, responseText)
      {
        rc_link_vote_result(responseObject);
      }
    });
    request.send();
}

function rc_link_vote_result(result) {
	
  if (result.link_id > 0) {
	
	$('link_vote_point_'+result.link_id).innerHTML = result.link_totalpoints;
		
	var up = $('link_vote_thumb_up_' + result.link_id);
	var dn = $('link_vote_thumb_dn_' + result.link_id);
	//alert(result.link_id);
	if (result.value > 0) {
		up.setProperty('class','link_vote_thumb_up_active');
		dn.setProperty('class','link_vote_thumb_dn_disabled');
	}
	else {
		up.setProperty('class','link_vote_thumb_up_disabled');
		dn.setProperty('class','link_vote_thumb_dn_active');
	}
	
	up.innerHTML = "<span>"+result.text_up+"</span>";
	dn.innerHTML = "<span>"+result.text_down+"</span>";	
  }
}


/* core-min.js start */var step_id = 0;

function confirmDelete(id) 
{
	step_id = id;
	TB_show('Delete Step', '#TB_inline?height=100&width=300&inlineId=confirmdelete', '', '../images/trans.gif');
}

function deleteStep() 
{
	window.location = 'admin_started.php?task=delete&step_id='+step_id;
}

function editStep(id, order, title, desc) 
{
	$('step_id').value = id;
	$('step_order_id').defaultValue = order;
	$('step_order_id').value = order;
	$('step_title').defaultValue = title;  
	$('step_title').value = title;  
	$('step_desc').defaultValue = desc;  
	$('step_desc').value = desc;

	TB_show('Edit Step', '#TB_inline?height=450&width=450&inlineId=editstep', '', '../images/trans.gif');
}

function addStep() 
{
	TB_show('Add Step', '#TB_inline?height=450&width=450&inlineId=addstep', '', '../images/trans.gif');
}

function stepHelp() 
{
	TB_show('Getting Started Help', '#TB_inline?height=450&width=450&inlineId=stephelp', '', '../images/trans.gif');
}

/* IGNORE THIS
function changeStep(step) 
{
    document.getElementById('started_core').innerHTML = step;
}
*//* game_tag.js start */

var newtag;
var current_user;
var isTagging = false;
var tags = [];


// THIS FUNCTION CREATES A NEW TAGGING INSTANCE
function addTag() {
  if(!isTagging) {
    isTagging = true;
    newtag = new MooCrop('game_media_photo');

    var indicator = $('game_media_photo_tagform').inject(newtag.wrapper);
    indicator.setStyles({'top' : newtag.crop.bottom+10, 'left' : newtag.crop.right+10, 'display' : 'block'});

    newtag.addEvent('onBegin', function(imgsrc, crop, bound, hanlde) { indicator.setStyle('display', 'none'); });
    newtag.addEvent('onCrop', function(imgsrc, crop, bound, hanlde) { indicator.setStyles({'top' : crop.bottom+10, 'left' : crop.right+10, 'display' : 'none'}); });
    newtag.addEvent('onComplete', function(imgsrc, crop, bound, hanlde) { indicator.setStyle('display', 'block'); });
  }
}

// THIS FUNCTION CANCELS THE TAGGING INSTANCE
function cancelTag() {
  if(isTagging) {
    $('game_media_photo_tag').value = '';
    $('game_media_photo_tagform').inject('game_media_photo_div').setStyle('display', 'none');
    var stopTagging = newtag.removeOverlay.bind(newtag);
    stopTagging();
    isTagging = false;
  }
}

// THIS FUNCTION ATTEMPTS TO SAVE A NEW TAG
function saveTag(owner_username, game_id, game_media_id, game_mediatag_user_id) {
  if(isTagging) {

    var url = 'game_file.php?task=tag&user='+owner_username;
    url += '&game_id='+game_id;
    url += '&game_media_id='+game_media_id;
    url += '&game_mediatag_user_id='+game_mediatag_user_id;
    url += '&game_mediatag_text='+encodeURIComponent($('game_media_photo_tag').value);
    url += '&game_mediatag_x='+newtag.crop.top;
    url += '&game_mediatag_y='+newtag.crop.left;
    url += '&game_mediatag_height='+newtag.crop.height;
    url += '&game_mediatag_width='+newtag.crop.width;
    $('ajaxframe').src = url;

    $('game_media_photo_tag').value = '';
    $('game_media_photo_tagform').inject('game_media_photo_div').setStyle('display', 'none');
    var stopTagging = newtag.removeOverlay.bind(newtag);
    stopTagging();
    isTagging = false;
  }
}

// THIS FUNCTION CONSTRUCTS A NEW TAG ONCE CREATION IS CONFIRMED
function insertTag(tag_id, tag_link, tag_text, tag_x, tag_y, tag_width, tag_height, owner_username, game_id, game_media_id, tagged_user) {

  var newHTML = '';

  if($('game_media_tags').style.display == 'none') {
    $('game_media_tags').style.display = 'block';
  } else if(tags.length != 0) {
    newHTML = '<span id="tag_comma_'+tag_id+'">, </span>';
  }

  var newSpan = new Element("span", {'id' : 'full_tag_'+tag_id, 'html' : newHTML});
  if(tag_link != '') {
    var newAnchor = new Element("a", {'href' : tag_link, 
			'id' : 'tag_link_'+tag_id,
			'html' : tag_text
		}).inject(newSpan);
  } else {
    var newAnchor = new Element("span", {'id' : 'tag_link_'+tag_id,
				'html' : tag_text,
				'styles' : {'cursor' : 'pointer'}
			}).inject(newSpan);
  }

  if(current_user == tagged_user || current_user == owner_username) {
    var game_media_tags_text = $(newSpan).get('html');
    $(newSpan).set('html', game_media_tags_text, ' (<a href=\'javascript:void(0);\' id=\'new_removetag_link\'>'+SELanguage.Translate(11000173)+'</a>)');
  }

  newSpan.inject($('game_media_tags'));

  createTag(tag_id, tag_text, tag_x, tag_y, tag_width, tag_height);

  $('tag_link_'+tag_id).addEvent('mouseover', function() { showTag(tag_id); });
  $('tag_link_'+tag_id).addEvent('mouseout', function() { hideTag(tag_id); });

  if($('new_removetag_link')) {
    $('new_removetag_link').addEvent('click', function() { removeTag(tag_id, owner_username, game_id, game_media_id); });
    $('new_removetag_link').set('id', 'removetag_link_'+tag_id);
  }

  tags.push(tag_id);

}


// THIS FUNCTION CREATES A TAG FOR LATER VIEWING
function createTag(tag_id, label_text, tag_x, tag_y, tag_width, tag_height) {

  // CREATE TAG AND LABEL
  new Element("div", {'id' : 'tag_'+tag_id, 'html' : '<img src="./images/trans.gif" width="100%" height="100%" />', 'class' : 'tag_div_hidden', 'styles' : {'width' : (parseInt(tag_width)-4)+'px', 'height' : (parseInt(tag_height)-4)+'px', 'top' : tag_x+'px', 'left' : tag_y+'px'}}).inject($('game_media_photo_div'));
  new Element("div", {'id' : 'tag_label_'+tag_id, 'html' : label_text, 'class' : 'tag_label', 'styles' : {'display' : 'none', 'top' : (parseInt(tag_x)+parseInt(tag_height)+10)+'px', 'left' : tag_y+'px'}}).inject($('game_media_photo_div'));

  // ADD MOUSEOVER/MOUSEOUT EVENTS
  $('tag_'+tag_id).addEvent('mouseover', function() { showTag(tag_id); });
  $('tag_'+tag_id).addEvent('mouseout', function() { hideTag(tag_id); });
}

// THIS FUNCTION DISPLAYS A TAG
function showTag(tag_id) {
  $('tag_'+tag_id).className = 'tag_div';
  $('tag_label_'+tag_id).style.display = 'block';
}

// THIS FUNCTION HIDES A TAG FROM VIEW
function hideTag(tag_id) {
  $('tag_'+tag_id).className = 'tag_div_hidden';
  $('tag_label_'+tag_id).style.display = 'none';
}


// THIS FUNCTION REMOVES A TAG COMPLETELY
function removeTag(tag_id, owner_username, game_id, game_media_id) {

  var url = 'game_file.php?task=tag_remove&user='+owner_username;
  url += '&game_id='+game_id;
  url += '&game_media_id='+game_media_id;
  url += '&game_mediatag_id='+tag_id;
  $('ajaxframe').src = url;

  $('tag_'+tag_id).destroy();
  $('tag_label_'+tag_id).destroy();

  $('full_tag_'+tag_id).destroy();

  if(tags.indexOf(tag_id) == 0 && $('tag_comma_'+tags[1])) {
    $('tag_comma_'+tags[1]).destroy();
  }

  tags.splice(tags.indexOf(tag_id), 1);

  if(tags.length == 0) {
    $('game_media_tags').style.display = 'none';
  }
}


// THIS FUNCTION SENDS A JSON REQUEST FOR THE FRIENDLIST
function getFriendList(owner_username, game_id, game_media_id) {
  var request = new Request.JSON({secure: false, url: 'misc_js.php?task=friends_all',
		onComplete: function(jsonObj) { 
			addFriendToList(jsonObj.friends, owner_username, game_id, game_media_id);
		}
  }).send();
}


// THIS FUNCTION TAKES A JSON RESULT AND POPULATES THE FRIENDLIST
function addFriendToList(friends, owner_username, game_id, game_media_id) {
  if($('game_media_photo_friendlist')) {
    friends.each(function(friend) {
      for(var x in friend) {

	var newDiv = new Element("div", {'id' : 'friend_div_'+x});
	var newAnchor = new Element("a", {'href' : 'javascript:void(0)', 
			'id' : 'friend_link_'+x,
			'html' : friend[x]
		}).inject(newDiv);

	newDiv.inject($('game_media_photo_friendlist'));

	$('friend_link_'+x).addEvent('click', function() { saveTag(owner_username, game_id, game_media_id, x); });
      }
    });
  }
}





/***
 * MooCrop (v. rc-1 - 2007-10-24 )
 *
 * @version			rc-1
 * @license			BSD-style license
 * @author			nwhite - < nw [at] nwhite.net >
 * @infos			http://www.nwhite.net/MooCrop/
 * @copyright		Author
 * 

 */
var MooCrop = new Class({

	calculateHandles : true,
	current : {},

	options : {
		maskColor : 'black',
		maskOpacity : '.3',
		handleColor : '#FFFFFF',
		handleWidth : '5px',
		handleHeight : '5px',
		cropBorder : '1px dashed #FFFFFF',
		min : { 'width' : 50, 'height' : 50 },
		showMask : true, // false to remove, helps on slow machines
		showHandles : false // hide handles on drag
	},

	initialize: function(el, options){
		this.setOptions(options);
		this.img = $(el);
		if ( this.img.get('tag') != 'img') return false;

		this.resizeFunc = this.refresh.bindWithEvent(this);
		this.removeFunc = this.removeListener.bind(this);

		this.buildOverlay();
		this.setup();
	},

	setup: function(){
		$(this.cropArea).setStyles({
			'width': this.options.min.width, 
			'height': this.options.min.height,
			'top' : (this.img.height - this.options.min.height)/2,
			'left': (this.img.width - this.options.min.width) / 2 
		});

		this.current.crop = this.crop = this.getCropArea();
		this.handleWidthOffset = this.options.handleWidth.toInt() / 2;
		this.handleHeightOffset = this.options.handleHeight.toInt() /2;

		this.fixBoxModel();
		this.drawMasks();
		this.positionHandles();
	},

	getCropArea : function(){
		var crop = this.cropArea.getCoordinates();
		crop.left -= this.offsets.x; crop.right -= this.offsets.x; // calculate relative (horizontal)
		crop.top -= this.offsets.y; crop.bottom  -= this.offsets.y; // calculate relative (vertical)
		return crop;
	},

	fixBoxModel : function(){
		var diff = this.boxDiff = (this.crop.width - this.options.min.width)/2;

		var b = this.bounds = { 'top' : diff, 'left' : diff, 
			'right' : this.img.width+(diff*2), 'bottom' : this.img.height+(diff*2),
			'width' : this.options.min.width+(diff*2), 'height' : this.options.min.height+(diff*2) };

		this.wrapper.setStyles({
			'width' : b.right, 'height' : b.bottom,
			'background' : 'url('+this.img.src+') no-repeat '+diff+'px '+diff+'px'
		});

		this.north.setStyle('width',b.right);
		this.south.setStyle('width',b.right);
	},

	activate : function(event,handle){
		event.stop();
		this.current = { 'x' : event.page.x, 'y' : event.page.y, 'handle' : handle, 'crop' : this.current.crop };
		if(this.current.handle == 'NESW' && !this.options.showHandles) this.hideHandles();
		this.fireEvent('onBegin',[this.img.src,this.getCropInfo(),this.bounds,handle]);
		document.addEvent('mousemove', this.resizeFunc);
		document.addEvent('mouseup', this.removeFunc);
	},

	removeListener : function(){
		if( this.current.handle == 'NESW' && !this.options.showHandles) this.showHandles();
		document.removeEvent('mousemove', this.resizeFunc);
		document.removeEvent('mouseup', this.removeFunc);
		this.crop = this.current.crop;
		this.fireEvent('onComplete',[this.img.src,this.getCropInfo(),this.bounds,this.current.handle]);
	},

	refresh : function(event){
		var xdiff = this.current.x - event.page.x;
		var ydiff = this.current.y - event.page.y;

		var b = this.bounds;  var c = this.crop;  var handle = this.current.handle; var styles = {}; //saving bytes
		var dragging = (handle.length > 2) ? true : false;
		
		if( handle.contains("S") ){//SOUTH
			if(c.bottom - ydiff > b.bottom ) ydiff = c.bottom - b.bottom; // box south
			if(!dragging){
				if( (c.height - ydiff) < b.height ) ydiff = c.height - b.height; // size south
				styles['height'] = c.height - ydiff; // South handles only
			}
		}
		if( handle.contains("N") ){//NORTH
			if(c.top - ydiff < b.top ) ydiff = c.top; //box north
			if(!dragging){
				if( (c.height + ydiff ) < b.height ) ydiff = b.height - c.height; // size north
				styles['height'] = c.height + ydiff; // North handles only
			}
			styles['top'] = c.top - ydiff; // both Drag and N handles
		}
		if( handle.contains("E") ){//EAST
			if(c.right - xdiff > b.right) xdiff = c.right - b.right; //box east
			if(!dragging){
				if( (c.width - xdiff) < b.width ) xdiff = c.width - b.width; // size east
				styles['width'] = c.width - xdiff;
			}
		}
		if( handle.contains("W") ){//WEST
			if(c.left - xdiff < b.left) xdiff = c.left; //box west
			if(!dragging){
				if( (c.width + xdiff) < b.width ) xdiff = b.width - c.width; //size west
				styles['width'] = c.width + xdiff;
			}
			styles['left'] = c.left - xdiff; // both Drag and W handles
		}
		var preCssStyles = $merge(styles);
		if( $defined(styles.width)) styles.width -= this.boxDiff*2;
		if( $defined(styles.height)) styles.height -= this.boxDiff*2;

		this.cropArea.setStyles(styles);
		this.getCurrentCoords(preCssStyles);
		this.drawMasks();
		this.positionHandles();
		this.fireEvent('onCrop',[this.img.src,this.getCropInfo(),b,handle]);
	},

	getCurrentCoords : function(changed){
		var current = $merge(this.crop);
		
		if($defined(changed.left)){
			current.left = changed.left;
			if($defined(changed.width)) current.width = changed.width;
			else current.right = current.left + current.width;
		}
		if($defined(changed.top)){
			current.top = changed.top;
			if($defined(changed.height)) current.height = changed.height;
			else current.bottom = current.top + current.height;
		}
		if($defined(changed.width) && !$defined(changed.left)){
			current.width = changed.width; current.right = current.left + current.width;
		}
		if($defined(changed.height) && !$defined(changed.top)){
			current.height = changed.height; current.bottom = current.top + current.height;
		}
		this.current.crop = current;
	},

	drawMasks : function(){
		if(!this.options.showMask) return;
		var b = this.bounds;  var c = this.current.crop; var handle = this.current.handle;

		this.north.setStyle('height', c.top + 'px' );
		this.south.setStyle('height', b.bottom  - c.bottom  + 'px');
		this.east.setStyles({ height: c.height + 'px', width: b.right  - c.right + 'px',  top: c.top  + 'px', left: c.right + 'px'});
		this.west.setStyles({ height: c.height + 'px', width: c.left + 'px', top: c.top + 'px'});
	},

	positionHandles: function(){
		if(!this.calculateHandles) return;
		var c = this.current.crop; var wOffset = this.handleWidthOffset; var hOffset = this.handleHeightOffset;

		this.handles.get('N').setStyles({'left' : c.width / 2 - wOffset + 'px', 'top' : - hOffset + 'px'});
		this.handles.get('NE').setStyles({'left' : c.width - wOffset + 'px', 'top' : - hOffset + 'px'});
		this.handles.get('E').setStyles({ 'left' : c.width - wOffset + 'px', 'top' : c.height / 2 - hOffset + 'px'});
		this.handles.get('SE').setStyles({'left' : c.width - wOffset + 'px', 'top' : c.height - hOffset + 'px'});
		this.handles.get('S').setStyles({'left' : c.width / 2 - wOffset + 'px', 'top' : c.height - hOffset + 'px'});
		this.handles.get('SW').setStyles({'left' : - wOffset + 'px', 'top' : c.height - hOffset + 'px'});
		this.handles.get('W').setStyles({'left' : - wOffset + 'px', 'top' : c.height / 2 - hOffset + 'px'});
		this.handles.get('NW').setStyles({'left' : - wOffset + 'px', 'top' : - hOffset + 'px'});
	},

	hideHandles: function(){
		this.calculateHandles = false;
		this.handles.each(function(handle){
			handle.setStyle('display','none');
		});
	},

	showHandles: function(){
		this.calculateHandles = true;
		this.positionHandles();
		this.handles.each(function(handle){
			handle.setStyle('display','block');
		});
	},

	buildOverlay: function(){
		var o = this.options;

		this.wrapper = new Element("div", {
			'styles' : {'z-index' : 100, 'position' : 'relative', 'width' : this.img.width, 'height' : this.img.height, 'background' : 'url('+this.img.src+') no-repeat' , 'float' : this.img.getStyle('float') , 'margin-left' : 'auto' , 'margin-right' : 'auto'  }
		}).injectBefore(this.img);

		this.img.setStyle('display','none');

		this.offsets = { x : this.wrapper.getLeft(), y : this.wrapper.getTop() };

		// SET WRAPPER MOUSEOVER TO STOP PROPAGATION OF MOUSEOVER EVENT
		this.wrapper.addEvent('mouseover', function(event) { return false; });

		if(this.options.showMask){		// optional masks
			var maskStyles = { 'position' : 'absolute', 'overflow' : 'hidden', 'background-color' : o.maskColor, 'opacity' : o.maskOpacity};
			this.north = new Element("div", {'styles' : $merge(maskStyles,{'left':'0px'})}).injectInside(this.wrapper);
			this.south = new Element("div", {'styles' : $merge(maskStyles,{'bottom':'0px', 'left':'0px'})}).injectInside(this.wrapper);
			this.east =  new Element("div", {'styles' : maskStyles}).injectInside(this.wrapper);
			this.west =  new Element("div", {'styles' : $merge(maskStyles,{'left':'0px'})}).injectInside(this.wrapper);
		}

		this.cropArea = new Element("div", { 'styles' : { 'position' : 'absolute', 'top' : '0px', 'left' : '0px', 'border' : o.cropBorder, 'cursor' : 'move' },
		'events' : {
			'dblclick' : function(){ this.fireEvent('onDblClk',[this.img.src,this.getCropInfo(),this.bounds])}.bind(this),
			'mousedown' : this.activate.bindWithEvent(this,'NESW')}
		}).injectInside(this.wrapper);

		this.handles = new Hash();
		['N','NE','E','SE','S','SW','W','NW'].each(function(handle){
			this.handles.set(handle, new Element("div", {
			'styles' : { 'position' : 'absolute', 'background-color' : o.handleColor, 
						 'width' : o.handleWidth, 'height' : o.handleHeight, 'overflow' : 'hidden', 'cursor' : (handle.toLowerCase()+'-resize')},
			'events' : {'mousedown' : this.activate.bindWithEvent(this,handle)}
			}).injectInside(this.cropArea));
		},this);
	},

	getCropInfo : function(){
		var c = $merge(this.current.crop);
		c.width -= this.boxDiff*2; c.height -= this.boxDiff*2;
		return c;
	},

	removeOverlay: function(){
		this.wrapper.destroy();
		this.img.setStyle('display','');
	}

});
MooCrop.implement(new Events, new Options);/* semods.js start *//*
 * SocialEngineMods Javascript Library v0.3
 * http://www.SocialEngineMods.Net
 * CRC: d31ddb93cb990f9b5eb26012d2ae97a0
 *
 * Copyright SocialEngineMods.Net
 * This code is licensed GPL for use exclusively on SocialEngine sites
 *
 */


/* Extensions */


Function.prototype.bind = function(obj) {
  var method = this, temp = function() {
    return method.apply(obj, arguments)
  };
  return(temp);
}; 

__super_class = function (obj) {
  this.__super=obj;
  this.__parent=obj.prototype.parent;
};

__super_class.prototype = {
  __super_method : function(method, pointer) {
    var __pointer=pointer;
    this[method]=function() {
      var __parent=this.__context.parent;
      this.__context.parent=__parent ? __parent.parent : null;
      var __ret=__pointer.apply(this.__context, arguments);
      this.__context.parent=__parent;
      __parent=null;
      return __ret;
    };
  },
  
  construct : function(context) {
    this.__context=context;
    var a=new Array();
    for (var i=1; i<arguments.length; i++) {
      a.push(arguments[i]);
    }
    this.__context.parent=this.__parent;
    var __ret=this.__super.apply(context, a);
    this.__context.parent=this;
    return __ret;
  }
};

Function.prototype.extend=function(obj) {
  this.prototype.parent=new __super_class(obj);
  for (var i in obj.prototype) {
    if (typeof obj.prototype[i]=='function') {
      this.prototype[i]=obj.prototype[i];
      this.prototype.parent.__super_method(i, obj.prototype[i]);
    }
    else if (i!='parent') {
      this.prototype[i]=obj.prototype[i];
    }
  }
};


/* SEMods */


SEMods = function () {};


/* SEMods Utils */


SEMods.Utils = function () {};
SEMods.Utils = {
  dbgFunc : null,
  
  htmlspecialchars : function (text) {
	  return text ? text.toString().replace(/&/g, '&amp;').replace(/"/g, '&quot;').replace(/'/g, '&#039;').replace(/</g, '&lt;').replace(/>/g, '&gt;') : '';
  },

  toHtml : function (text) {
	  return SEMods.Utils.htmlspecialchars(text).replace(/\n/g, '<br />');
  },
  
  debug : function (message) {
	if(SEMods.debug)
	  this.dbgFunc ? this.dbgFunc(message) : alert(message);
  },
  
  setDebugger : function(dbgFunc) {
	this.dbgFunc = dbgFunc;
  },
  
  unescapeQuotes : function (word) {

	// jsesq is a key/acronym for javascript escaped single quote
	// jsdsq is a key/acronym for javascript escaped double quote
  
	escaped = word.replace(/:jsesq:/g, "'"); 
	escaped = escaped.replace(/:jsedq:/g, '"'); 
	escaped = escaped.replace(/:jselb:/g, '\['); 
	escaped = escaped.replace(/:jserb:/g, '\]'); 
	escaped = escaped.replace(/:jsebs:/g, '\\'); 
  
	return escaped;
  },
  
  arrayToQueryString : function (queryArray)  {
	var query = '';
	
	for( var key in queryArray ) {
	  query += encodeURIComponent(key) + '=' + encodeURIComponent(queryArray[key]) + '&';
	}
	
	return query.slice(0, -1);
  }

};


/* SEMods Browser */


SEMods.Browser = function () {};
SEMods.Browser = {
    isIE : (/msie/i.test(navigator.userAgent) && !/opera/i.test(navigator.userAgent) ),
    isFireFox : (/FireFox/i.test(navigator.userAgent)),
    isOpera : (/Opera/i.test(navigator.userAgent)),

    addEvent : function (obj, type, func) {
        if (obj.addEventListener) {
            obj.addEventListener(type, func, 0);
        } else if (obj.attachEvent) {
            obj.attachEvent("on" + type, func);
        }
    },
    
	register_onload : function (handler) {
	  if (window.onload) {
	    var original_handler=window.onload;
	    window.onload=function() { original_handler(); handler(); };
	  }
	  else {
	    window.onload=handler;
	  }
	},
	
	ge : function(element) {
      var elem;
      if( typeof element == 'string' ) {
        elem = document.getElementById(element);
        
        // try by name, first in array
        if(!elem)
          elem = this.geByName(element);
      } else {
        elem = element;
      }
      return elem;
	},
    
	geByName : function(element) {
		var elems = document.getElementsByName(element);
        if(elems.length == 1)
          return elems[0];
        return null;
	},
    
    show : function () {
      for( var i = 0; i < arguments.length; i++ ) {
        var element = SEMods.B.ge(arguments[i]);
        if (element && element.style) element.style.display = 'block';
      }
    },
    
    hide : function () {
      for( var i = 0; i < arguments.length; i++ ) {
        var element = SEMods.B.ge(arguments[i]);
        if (element && element.style) element.style.display = 'none';
      }
    },

    toggle : function () {
      for( var i = 0; i < arguments.length; i++ ) {
        var element = SEMods.B.ge(arguments[i]);
	    element.style.display = (element.style.display == 'block') ? 'none' : 'block';
      }
    },

    // Get Absolute X Position of HTML Element
    findX : function(obj) {
      var curleft = 0;
      if (obj.offsetParent) {
        while (obj.offsetParent) {
          curleft += obj.offsetLeft
          obj = obj.offsetParent;
        }
      }
      else if (obj.x)
        curleft += obj.x;
      return curleft;
    },
    
  
    // Get Absolute Y Position of HTML Element
    findY : function (obj) {
      var curtop = 0;
      if(obj.offsetParent) {
        while (obj.offsetParent) {
          curtop += obj.offsetTop
          obj = obj.offsetParent;
        }
      }
      else if (obj.y)
        curtop += obj.y;
      return curtop;
    },
    
    mousePosX : function (e) {
      var posx = 0;
      if (!e) var e = window.event;
      if (e.pageX)
        posx = e.pageX;
      else if (e.clientX && document.body.scrollLeft)
        posx = e.clientX + document.body.scrollLeft;
      else if (e.clientX && document.documentElement.scrollLeft)
        posx = e.clientX + document.documentElement.scrollLeft;
      else if (e.clientX)
        posx = e.clientX;
      return posx;
    },
    
    mousePosY : function (e) {
      var posy = 0;
      if (!e) var e = window.event;
      if (e.pageY)
        posy = e.pageY;
      else if (e.clientY && document.body.scrollTop)
        posy = e.clientY + document.body.scrollTop;
      else if (e.clientY && document.documentElement.scrollTop)
        posy = e.clientY + document.documentElement.scrollTop;
      else if (e.clientY)
        posy = e.clientY;
      return posy;
    },
    
    getStyle : function(obj, property) {
        if (window.getComputedStyle) {
            return window.getComputedStyle(obj, null).getPropertyValue(property);
        }
        if (document.defaultView && document.defaultView.getComputedStyle) {
            var computedStyle = document.defaultView.getComputedStyle(obj, null);
            if (computedStyle) return computedStyle.getPropertyValue(property);
        }
        if (obj.currentStyle) {
            return obj.currentStyle[property];
        }
        return obj.style[property];
    },
    
    getStyleName : function(stylename) {
      return SEMods.Browser.isIE ? stylename : stylename.replace(/[A-Z]/g, function(a){return'-'+a.toLowerCase();} );
    },
    
    // em's not supported for now
    getPXMetrics : function(metric, defvalue) {
      var metricBase = parseFloat(metric);
      if(isNaN(metricBase)) return defvalue!=null ? defvalue : metricBase;
      return /px/i.test(metric) ? metricBase : /pt/i.test(metric) ? 1.3333*metricBase  : metricBase;
    },
    
    createDiv : function( parent, id, cname ) {
      var div = document.createElement("div");
      if(id) div.id = id;
      if(cname) div.className = cname;
      parent.appendChild( div );
      return div;
  }
  
};



/* Shortcuts */



SEMods.B = SEMods.Browser;
SEMods.U = SEMods.Utils;



/* SEMods TextAreaControl */



SEMods.TextAreaControl = function(object) {
    this.obj = object;
    this.obj.style['overflow'] = 'hidden';
    this.originalHeight = this.obj.offsetHeight;
    var updater = this.update.bind(this);
    SEMods.Browser.addEvent(object, "focus", this.onFocus.bind(this));
    SEMods.Browser.addEvent(object, "blur", this.onBlur.bind(this));
    this.update();
};

SEMods.TextAreaControl.prototype = {
    obj : null,
    updating : false,
    autoGrow : false,
    originalHeight : null,
    shadowElement : null,
    increment : 0,
    timer : null,
    lastLength : 0,
    fontFamily : SEMods.Browser.getStyleName('fontFamily'),
    fontSize : SEMods.Browser.getStyleName('fontSize'),
    paddingLeft : SEMods.Browser.getStyleName('paddingLeft'),
    paddingRight : SEMods.Browser.getStyleName('paddingRight'),
    lineHeight : SEMods.Browser.getStyleName('lineHeight'),
    
    setAutoGrow : function(autoGrow) {
        this.autoGrow = autoGrow;
        this.createShadowElement();
        this.update();
    },
    
    onUpdate : function() {
        if(this.autoGrow && this.lastLength != this.obj.value.length) {
            this.lastLength = this.obj.value.length;
            this.updateShadowElement();
            this.obj.style.height = Math.max(this.originalHeight, this.shadowElement.offsetHeight + this.increment) + 'px';
        }
    },
    
    beginUpdate : function() {
        if(this.updating)
            return false;
        this.updating = true;
        return true;
    },
    
    endUpdate : function() {
        this.updating = false;
    },
    
    update : function() {
        if(!this.beginUpdate())
            return;
        
        this.onUpdate();
        this.endUpdate();
    },
    
    createShadowElement : function() {
        if(this.shadowElement)
            return;
        
        this.shadowElement = document.createElement("DIV");
        this.shadowElement.style.position = "absolute";
        this.shadowElement.style.top = "-99999px";
        this.shadowElement.style.left = "-99999px";
        
        document.body.appendChild(this.shadowElement);
    },
    
    updateShadowElement : function () {
        if(this.shadowElement) {
            this.shadowElement.innerHTML = SEMods.Utils.toHtml(this.obj.value + '<br>');
            var fontSize = SEMods.Browser.getPXMetrics( SEMods.Browser.getStyle(this.obj, this.fontSize), 10);
            var lineHeight = SEMods.Browser.getStyle(this.obj, this.lineHeight);
            // Opera misses on line-height
            if(SEMods.Browser.isOpera) 
              lineHeight = SEMods.Browser.getPXMetrics( lineHeight, 0) + 3 + 'px';
              
            this.increment = fontSize + 10;
        
            this.shadowElement.style['width'] = this.obj.offsetWidth + 'px';
            this.shadowElement.style['lineHeight'] = lineHeight;
            this.shadowElement.style['fontSize'] = SEMods.Browser.getStyle(this.obj, this.fontSize);

            this.shadowElement.style['fontFamily'] = SEMods.Browser.getStyle(this.obj, this.fontFamily);
            this.shadowElement.style['paddingLeft'] = SEMods.Browser.getStyle(this.obj, this.paddingLeft);
            this.shadowElement.style['paddingRight'] = SEMods.Browser.getStyle(this.obj, this.paddingRight);
            
        } 
    },
    
    onFocus : function() {
      this.timer = setInterval(this.update.bind(this), 500);
    },
    
    onBlur : function() {
      if(this.timer) {
        clearInterval(this.timer);
        this.timer = null;
      }
    }
    
};



/* SEMods TextAreaControl */



SEMods.Ajax = function (doneHandler, failHandler)
{
  this.onDone = doneHandler;
  this.onFail = failHandler;
  this.transport = this.getTransport();
  this.transport.onreadystatechange = this.stateDispatch.bind(this);
};

SEMods.Ajax.prototype = {
  
  get : function (uri, query, force_sync)  {
    // Firefox doesn't call onDone and onFail handlers if you force_sync
    force_sync = force_sync || false;
    if( typeof query != 'string' )
      query = SEMods.U.arrayToQueryString(query);
    fullURI = uri+(query ? ('?'+query) : '');
    this.transport.open('GET', fullURI, !force_sync );
    this.transport.send('');
  },

  post : function (uri, data, force_sync) {
    force_sync = force_sync || false;
    if( typeof data != 'string' )
      data = SEMods.U.arrayToQueryString(data);
    this.transport.open('POST', uri, !force_sync);
    this.transport.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    this.transport.send(data);
  },

  stateDispatch : function () {

    if( this.transport.readyState == 4 ) {
      if( this.transport.status >= 200 &&
          this.transport.status < 300 &&
          this.transport.responseText.length > 0 ) {
        if( this.onDone ) this.onDone(this, this.transport.responseText);
      } else {
        if( this.onFail ) this.onFail(this);
      }
    }
  },

  getTransport : function () {
    var ajax = null;
    
    try { ajax = new XMLHttpRequest(); }
    catch(e) { ajax = null; }
    
    try { if(!ajax) ajax = new ActiveXObject("Msxml2.XMLHTTP"); }
    catch(e) { ajax = null; }
    
    try { if(!ajax) ajax = new ActiveXObject("Microsoft.XMLHTTP")}
    catch(e) { ajax = null; }
    
    return ajax;
  }
};


/* Global namespace helper functions */


function textarea_autogrow(elementid) {
    var el = SEMods.Browser.ge(elementid);
    if(!el) SEMods.Utils.debug("textarea_autogrow(): element not found");
    if(el && !el._controlled) {
        el._controlled = true;
        new SEMods.TextAreaControl(el).setAutoGrow(true);
    }
};

/* semods_apps.js start *//*
 * SocialEngineMods Apps v3.00
 * http://www.SocialEngineMods.Net
 *
 * Copyright SocialEngineMods.Net
 * This code is NOT an open source
 *
 */



/* EXTENSIONS */



Array.prototype.in_array = function(p_val) {
   for(var i = 0, l = this.length; i < l; i++) {
       if(this[i] == p_val) {
           return true;
       }
   }
   return false;
}



function semods_add_row(name, id) {

  if (typeof id == 'undefined') id = '';
  
  var el = document.getElementById(name+'_template').cloneNode(true);
  el.id = id;
  var moreRow = document.getElementById(name+"_addmorerow");
  moreRow.parentNode.insertBefore(el, moreRow)
  return el;
    
}



// Teach IE manners
//if(typeof(window.external) != 'undefined'){
if( SEMods.Browser.isIE || SEMods.Browser.isOpera ){
  document.getElementsByName = function(name, tag){
	  if(!tag){
		  tag = '*';
	  }
	  var elems = document.getElementsByTagName(tag);
	  var res = []
	  for(var i=0;i<elems.length;i++){
		  att = elems[i].getAttribute('name');
		  if(att == name) {
			  res.push(elems[i]);
		  }
	  }
	  return res;
  }

}


function hideMenuEx() {
  if($(open_menu)) { hideMenu($(open_menu)); }
}


function apps_open_support_ticket(subject, message) {
   var form = document.createElement("FORM");
   form.action = "admin_semods_support.php";
   form.method = "POST";
   form.encoding = "multipart/encoded";
   
   var elem = document.createElement("INPUT");
   elem.type = "text";
   elem.name = "subject";
   elem.value = escape(subject);
   form.appendChild(elem);

   elem = document.createElement("INPUT");
   elem.type = "text";
   elem.name = "message";
   elem.value = escape(message);
   form.appendChild(elem);

   elem = document.createElement("INPUT");
   elem.type = "text";
   elem.name = "fresh";
   elem.value = 1;
   form.appendChild(elem);
 
   document.body.appendChild(form);
   
   form.submit();
}


function apps_notify_new_messages() {
  var elems = document.getElementsByTagName("A");
  for(var i=0;i<elems.length;i++) {
     if(elems[i].href.match(/admin_apps_messages.php/)) {
        elems[i].style['backgroundColor'] = "#FFF4A5";
        break;
     }
  }
}


/* MORE APPS MENU */
function apps_menu_moreapps_onclick() {
   var apps = SEMods.B.ge("menu_dropdown_apps");
   var moreapps = SEMods.B.ge("menu_dropdown_moreapps");
   if(moreapps) {
      moreapps.style.left = SEMods.B.findX(apps) + 20 + 'px';
      moreapps.style.top = SEMods.B.findY(apps) - 6 + 'px';
      showMenu("menu_dropdown_moreapps");
   }
}


/* MORE TOP BAR MENU */
function apps_menu_main_more() {

  // find our anchor
  var position_elem = null;
  elems = document.getElementsByTagName("A");
  for(var i=0;i<elems.length;i++) {
    if((elems[i].className == 'top_menu_item') && elems[i].href.match(/javascript:apps_menu_main_more/) ) {
      position_elem = elems[i];
      break;
    }
  }

  // no luck
  if(!position_elem)
    return;
  
  position_elem.blur();
  
  /* A is enclosed in DIV which is inside DIV */
  position_elem = position_elem.parentNode.parentNode;
  var moreapps = SEMods.B.ge("menu_main_more_apps");
  if(moreapps) {
    ff_offset = SEMods.B.isFireFox ? 0 : 1;
    moreapps.style.left = SEMods.B.findX(position_elem) + 'px';
    //moreapps.style.top = SEMods.B.findY(position_elem) + position_elem.offsetHeight - 6 + 1 + 'px';
    moreapps.style.top = SEMods.B.findY(position_elem) + ff_offset + 'px';
    showMenu("menu_main_more_apps");
  }
}





/* APP PAGE */

function app_show_profile_onClick(app_id) {
  
  SEMods.B.hide("app_show_conf");  
  SEMods.B.show("app_show_progress");  
  SEMods.Apps.placeApp( app_id, SEMods.B.ge("app_show_profile").checked*1, 1, 0, app_show_updated);   
  
}

function app_show_userhome_onClick(app_id) {

  SEMods.B.hide("app_show_conf");  
  SEMods.B.show("app_show_progress");  
  SEMods.Apps.placeApp( app_id, SEMods.B.ge("app_show_userhome").checked*1, 2, 0, app_show_updated );   
  
}

function app_show_updated() {
  SEMods.B.hide("app_show_progress");  
  SEMods.B.show("app_show_conf");  
}




/* USER APPS */

function apps_uninstall(app_id, page_id, view_id) {
  SEMods.Apps.removeApp(app_id, page_id, view_id);
  SEMods.B.hide('approw_'+app_id);
}


function apps_show_error_message(error_message) {
   elem = SEMods.B.ge("apps_error_message_div");
   if(!elem) {
      return;
   }
   if(error_message && (error_message != '')) {
      elem.innerHTML = error_message;
   }
   mooFaceboxExShow("", "#apps_error_message_div");
}

/* PAGES */

function apps_inplace_edit(app_id) {
  
  hideMenuEx();
  SEMods.Apps.ProfileDragDrop.editContent(app_id);
  
}

function apps_edit_box(app_id) {
  hideMenuEx();
  SEMods.Apps.ProfileDragDrop.editContent(app_id);
}


function apps_get_appbox(app_id) {
  if(app_id.indexOf('_') != -1) {
    app_id = app_id.split('_')[1];
  }
  appbox = SEMods.B.ge('app_'+app_id);
  // try harder
  if(!appbox)
    appbox = SEMods.B.ge('core_'+app_id);
  // try harder
  if(!appbox)
    appbox = SEMods.B.ge('plugin_'+app_id);
  return appbox;
}


function app_boxdialog(app_id, position) {
  // plugin_XXX, ...
  if(app_id.indexOf('_') != -1) {
    app_id = app_id.split('_')[1];
  }
  box = SEMods.B.ge("appsettings_app_"+app_id);
  appbox = apps_get_appbox(app_id);
    
  var top = SEMods.B.findY( appbox );
  var left = SEMods.B.findX( appbox ) + appbox.offsetWidth - 1;

  box.style.left = -9999 + 'px';
  box.style.top = -9999 + 'px';
  showMenu("appsettings_app_"+app_id);
  //SEMods.B.show(box);

  // check if off screen
  if((left + box.offsetWidth) > document.body.offsetWidth) {
    left -= box.offsetWidth;
    box.className = "apps_settingsbox1";
  }

  box.style.left = left + 'px';
  box.style.top = top + 'px';

  showMenu("appsettings_app_"+app_id);
}


function app_tabdialog(app_id) {
  box = SEMods.B.ge("appsettings_"+app_id);
  appbox = SEMods.B.ge(app_id);
  if(!appbox || !box) 
    return;
  // get our master 
  do{
   appbox = appbox.previousSibling; 
  } while(appbox.nodeType != 1)
  
  var left = SEMods.B.findX( appbox ) + appbox.offsetWidth - 10 ;
  var top = SEMods.B.findY( appbox ) - 1 + 3;

  box.style.left = left + 'px';
  box.style.top = top + 'px';
  //SEMods.B.show(box);
  showMenu("appsettings_"+app_id);
}


function apps_show_grip_item(app_id, app_name) {
  // find last shown tab and hide it
  var elems = document.getElementsByName("profile_tabs_wrap", "TD");
  for(var i=elems.length-1; i>=0; i--) {
    if(elems[i].style.display != 'none') {
      // found it
      elems[i].style.display = 'none';
      break;
    }
  }

  try {
    hideMenu(SEMods.B.ge("tabs_grip"));
  }
  catch(ex) {
  }

  SEMods.B.ge("profile_tabs_wrap_"+app_name).style.display='';

  loadProfileTab(app_name);
}

function appbox_uninstall(app_id) {
  clean_app_id = app_id;
  if(app_id.indexOf('_') != -1) {
    clean_app_id = app_id.split('_')[1];
  }
  hideMenu(SEMods.B.ge("appsettings_app_"+clean_app_id));
  SEMods.Apps.ProfileDragDrop.removeApp(app_id);
  appbox = apps_get_appbox(app_id);
  SEMods.B.hide(appbox);
}

function apps_removebox(app_id) {
  clean_app_id = app_id;
  if(app_id.indexOf('_') != -1) {
    clean_app_id = app_id.split('_')[1];
  }
  hideMenu(SEMods.B.ge("appsettings_app_"+clean_app_id));
  SEMods.Apps.ProfileDragDrop.removeBox(app_id);
  appbox = apps_get_appbox(app_id);
  SEMods.B.hide(appbox);
}

function appbox_moveto_sidebar(app_id) {
  clean_app_id = app_id;
  if(app_id.indexOf('_') != -1) {
    clean_app_id = app_id.split('_')[1];
  }
  SEMods.B.hide("appsettings_app_"+clean_app_id);

  // menu options
  SEMods.B.hide("appsettings_app_"+clean_app_id+"_moveto_sidebar");
  SEMods.B.show("appsettings_app_"+clean_app_id+"_moveto_apptab");

  SEMods.Apps.ProfileDragDrop.moveToContainer(app_id, "root", 0);
  loadProfileTab("profile");
}

function appbox_moveto_apptab(app_id) {
  clean_app_id = app_id;
  if(app_id.indexOf('_') != -1) {
    clean_app_id = app_id.split('_')[1];
  }
  SEMods.B.hide("appsettings_app_"+clean_app_id);

  // menu options
  SEMods.B.show("appsettings_app_"+clean_app_id+"_moveto_sidebar");
  SEMods.B.hide("appsettings_app_"+clean_app_id+"_moveto_apptab");

  SEMods.Apps.ProfileDragDrop.moveToContainer(app_id, "apptab", 0);

   // show the apps tab
  SEMods.B.ge("profile_tabs_wrap_apps").style.display='';
   
  loadProfileTab("apps");
}


function apps_add_totab_dialog() {
  box = SEMods.B.ge("add_to_tab");
  appbox = SEMods.B.ge("profile_tabs_add");
  var left = SEMods.B.findX( appbox ) + appbox.clientWidth - 5;
  var top = SEMods.B.findY( appbox );


  box.style.left = left + 'px';
  box.style.top = top + 'px';
  showMenu("add_to_tab");
}

function apps_tab_grip_dialog() {
  box = SEMods.B.ge("tabs_grip");
  appbox = SEMods.B.ge("profile_tabs_grip");
  var left = SEMods.B.findX( appbox ) + appbox.clientWidth - 4;
  var top = SEMods.B.findY( appbox );


  box.style.left = left + 'px';
  box.style.top = top + 'px';
  showMenu("tabs_grip");
}

function appbox_moveto_tab(app_id) {
  hideMenu(SEMods.B.ge("add_to_tab"));
  SEMods.Apps.ProfileDragDrop.moveBoxToTabs(app_id);
}

function appbox_remove_from_tab(app_id) {
  hideMenu(SEMods.B.ge("appsettings_"+app_id));
  SEMods.Apps.ProfileDragDrop.removeBoxFromTabs(app_id);
}











/* SEMods.Apps */ 


SEMods.Apps = function () {};

SEMods.Apps = {
  api_endpoint : 'ajax_semods_apps.php?',
  api_content_endpoint : 'appcontent.php?',     // MUST end with "?"
  app_url : '',
  
  removeApp : function (app_id, page_id, view_id) {
    var ajax = new SEMods.Ajax();
	var params = 'task=removeapp' + '&appid=' + app_id;

    if (typeof page_id != 'undefined') params += '&pid=' + page_id;
    if (typeof view_id != 'undefined') params += '&vid=' + view_id;
   
    ajax.post(this.api_endpoint, params );
    
  },
  
  placeApp : function(app_id, show, page_id, view_id, placeApp_callback) {
    if (typeof view_id == 'undefined')
      view_id = 0;
    if(show == 0)
      task = 'removebox';
    else
      task = 'placeapp';

    new SEMods.Apps.AppPlacer( task, app_id, page_id, view_id, placeApp_callback );
    
  },
  
  hideNotification : function (id) {
    SEMods.B.hide("appnotify_"+id);
    var ajax = new SEMods.Ajax();
    ajax.post( this.api_endpoint, 'task=hidenotification' + '&notificationid=' + id );
  },
  
  cleanAppId : function(app_id) {
    clean_app_id = app_id;
    if(app_id.indexOf('_') != -1) {
      clean_app_id = app_id.split('_')[1];
    }
    return clean_app_id;
  }

};



/* SEMods.Apps.Language */ 



SEMods.Apps.Language = function () {};


SEMods.Apps.Language = {
   
}



/*** TABS ***/

SEMods.Apps.Tabs = function () {};

SEMods.Apps.Tabs = {
  
  instance : 'apps_tab1',
  visible_tab : '',
  full_screen : false,
  full_screen_exclude : ["profile","friends","comments"],
  
  
  loadProfileTab : function(tabId, full_screen) {
   
    // FULL SCREEN
    if(this.full_screen) {

      // show back if profile,friends,comments
      if(this.full_screen_exclude.in_array(tabId)) {
        //document.getElementById("profile_leftside").style.display = SEMods.B.isIE ? "inline" : "table-row";
        document.getElementById("profile_leftside").style.display = "";
      } else {
        document.getElementById("profile_leftside").style.display = "none";
      }

    }
    
    // no selected tab - just loaded
    if(this.visible_tab == '') {
      var elems = document.getElementsByName("profile_tabs_wrap", "TD");
      if(elems.length>0) {
        guess_tab_id = elems[0].id;
        guess_tab_id = guess_tab_id.substring(18);
        this.visible_tab = guess_tab_id;
      }
    }
  
    if(tabId == this.visible_tab) {
     return false;
    }
    
    // show appsetting box
    if(elem = SEMods.B.ge('profile_tabs_'+tabId)) {
     cells = elem.getElementsByTagName("TD");
     for(i=0;i<cells.length;i++) {
       if(cells[i].className == "apps_tabsetting") {
         SEMods.B.show(cells[i]);
         // TR -> TBODY -> TABLE
         cells[i].parentNode.parentNode.parentNode.className = "apps_activetab";
         break;
       }
     }
    }
       
    // hide appsetting box
    if(elem = SEMods.B.ge('profile_tabs_'+this.visible_tab)) {
     cells = elem.getElementsByTagName("TD");
     for(i=0;i<cells.length;i++) {
       if(cells[i].className == "apps_tabsetting") {
         SEMods.B.hide(cells[i]);
         cells[i].parentNode.parentNode.parentNode.className = "apps_inactivetab";
         break;
       }
     }
    }
       
    if($('profile_'+tabId)) {
         $('profile_tabs_'+tabId).className = this.instance + '2';
     $('profile_'+tabId).style.display = "block";
     if($('profile_tabs_'+this.visible_tab)) {
           $('profile_tabs_'+this.visible_tab).className = this.instance;
       $('profile_'+this.visible_tab).style.display = "none";
     }
     this.visible_tab = tabId;
    }
    
  }
  
}
  



SEMods.Apps.AppPlacer = function(task, app_id, page_id, view_id, placeApp_callback) {
  this.app_id = app_id;
  this.page_id = page_id;
  this.view_id = view_id;
  this.placeApp_callback = placeApp_callback;
  this.init(task);
};

SEMods.Apps.AppPlacer.prototype = {
  app_id : '',

  init : function(task) {
    clean_app_id = SEMods.Apps.cleanAppId(this.app_id);
    var ajax = new SEMods.Ajax( this.onSetPagePlacementSuccess.bind(this), this.onSetPagePlacementFail.bind(this) );
	var params = 'task=' + task + '&pid=' + this.page_id + '&vid=' + this.view_id + '&appid=' + clean_app_id + '&user=' + SEMods.Apps.ProfileDragDrop.owner;
    ajax.post(SEMods.Apps.api_endpoint, params );
  },

  onSetPagePlacementSuccess : function(obj, responseText) {
	var r = [];
	try {
	  r = eval('('+responseText+')');
	} catch(e) {
	  r.status = 1;
	};
  
    if(this.placeApp_callback)
      this.placeApp_callback(this.app_id);
      
	if(r.status == 0) {
      
	} else {
      apps_show_error_message( r.err_msg ? r.err_msg : '' );
    }
	
  },

  onSetPagePlacementFail : function(obj, responseText) {
    if(this.placeApp_callback)
      this.placeApp_callback();

      apps_show_error_message();
  }
  
}




SEMods.Apps.Utils = {};

SEMods.Apps.Utils = {

  /* parse and load scripts from ajaxed response */
  parseHTML : function(_source) {
    var source = _source;
    var scripts = new Array();
    
    // Strip out tags
    while(source.indexOf("<script") > -1 || source.indexOf("</script") > -1) {
        var s = source.indexOf("<script");
        var s_e = source.indexOf(">", s);
        var e = source.indexOf("</script", s);
        var e_e = source.indexOf(">", e);
        
        script_meta = source.substring(s+8, s_e);
        script_src = script_meta.match(/src="([^"]*)"/);
        script_src = script_src ? script_src[1] : '';

       // Add to scripts array
        scripts.push( {'data' : source.substring(s_e+1, e), 'src' :  script_src, 'type' : 'script' } );
          
        // Add to scripts array
//          scripts.push(source.substring(s_e+1, e));
        // Strip from source
        source = source.substring(0, s) + source.substring(e_e+1);
    }
    
    // Loop through every script collected and eval it
    for(var i=0; i<scripts.length; i++) {
        try {
//            script = document.createElement("script");
//			script.type = "text/javascript";

          // otherwise
          //var head = document.getElementsByTagName("head")[0] || document.documentElement,
          var head = document.getElementsByTagName("head")[0] || document.documentElement,
              script = document.createElement("script");

          script.type = "text/javascript";
        
          // if src
          if(scripts[i].src) {
             script.src = scripts[i].src;
             
          } else {
          
             if ( SEMods.B.isIE )
                script.text = scripts[i].data;
             else
                script.appendChild( document.createTextNode( scripts[i].data ) );
          }
          
          // Use insertBefore instead of appendChild  to circumvent an IE6 bug.
          // This arises when a base node is used (#2709).
          head.insertBefore( script, head.firstChild );
          //head.removeChild( script );
          
            //eval(scripts[i]);
        }
        catch(ex) {
            // do what you want here when a script fails
        }
    }
    
    
    // only needed for IE (and also doesnt seem to work.. update yes!!! now this works!!)
    // TODO: clean code - applyStyles / applyScripts
    //if(SEMods.Browser.isIE) {

    // and styles - do this with "link rel=stylesheet" ? <style> has no src
      var scripts = new Array();
      
      while(source.indexOf("<style") > -1 || source.indexOf("</style") > -1) {
          var s = source.indexOf("<style");
          var s_e = source.indexOf(">", s);
          var e = source.indexOf("</style", s);
          var e_e = source.indexOf(">", e);
          
          script_meta = source.substring(s+7, s_e);
          script_src = script_meta.match(/src="([^"]*)"/);
          script_src = script_src ? script_src[1] : '';
  
         // Add to scripts array
          scripts.push( {'data' : source.substring(s_e+1, e), 'src' :  script_src, 'type': 'css' } );
            
          // Add to scripts array
  //          scripts.push(source.substring(s_e+1, e));
          // Strip from source
          source = source.substring(0, s) + source.substring(e_e+1);
      }
  
      // Loop through every script collected and eval it
      for(var i=0; i<scripts.length; i++) {
          try {
  //            script = document.createElement("script");
  //			script.type = "text/javascript";
  
            // otherwise
            //var head = document.getElementsByTagName("head")[0] || document.documentElement,
            var head = document.getElementsByTagName("head")[0] || document.documentElement,
                script = document.createElement("style");
  
            script.type = 'text/css';
          
            
               if ( SEMods.B.isIE )
                  script.styleSheet.cssText = scripts[i].data;
               else
                  script.appendChild( document.createTextNode( scripts[i].data ) );
            
            // Use insertBefore instead of appendChild  to circumvent an IE6 bug.
            // This arises when a base node is used (#2709).
            head.insertBefore( script, head.firstChild );
            //head.removeChild( script );
            
              //eval(scripts[i]);
          }
          catch(ex) {
              // do what you want here when a script fails
          }
      }
      
    //}
    
    
    // Return the cleaned source
    return source;
   }
  
}




SEMods.Apps.ContentEditor = function ( page_id, view_id, app_id, app_block_id, stripe_id, placement, container, owner, editinplace ) {

  this.page_id = page_id;
  this.view_id = view_id;
  this.app_id = app_id;
  this.app_block_id = app_block_id;
  this.stripe_id = stripe_id;
  this.placement = placement;
  this.container = container;
  this.owner = owner;
  this.editinplace = editinplace;

  this.init();
  
};


SEMods.Apps.ContentEditor.prototype = {
  xx : '',
  
  init : function () {

  var params = 'task=editcontent' +
               '&pageid=' + this.page_id +
               '&viewid=' + this.view_id +
               '&id=' + this.app_id +
               '&appid=' + this.app_block_id +
               '&stripe=' + this.stripe_id +
               '&placement=' + this.placement +
               '&container=' + this.container +
               '&user=' + this.owner;

   if(this.editinplace == 1) {

    content_box = SEMods.B.ge("appcontent_"+this.app_block_id);
    content_box.innerHTML = "Loading...";

    var ajax = new SEMods.Ajax( this.onEditContentLoadSuccess.bind(this), this.onEditContentLoadFail.bind(this) );
      
                 
    ajax.post(SEMods.Apps.api_content_endpoint, params );
    
   } else if(this.editinplace == 2) {
    
    // TBD: full screen or not
      TBEX_show('EDIT',SEMods.Apps.api_content_endpoint + params + '&TBEX_iframe=true','','',1);
    
   } else {
    
    document.location = "user_apps_canvas.php?id=" + this.app_id +"&pageid=" + this.page_id + '&viewid=' + this.view_id + '&task=editcontent' + '&returnafteredit=' + encodeURIComponent(document.location);
    
   }
  
  
  },
  
  attachEvents : function() {
    
  },
  
  onSubmit : function(e) {
    var values = [];
    var elems = this.form.getElementsByTagName( "INPUT" );
    for(var i=0; i<elems.length;i++) {
      if(elems[i].type == "radio" || elems[i].type == "checkbox") {
         if(elems[i].checked) {
            values.push( encodeURIComponent(elems[i].name) + '=' + encodeURIComponent(elems[i].value) );
         }
      } else {
         values.push( encodeURIComponent(elems[i].name) + '=' + encodeURIComponent(elems[i].value) );
      }
    }

    var elems = this.form.getElementsByTagName( "SELECT" );
    for(var i=0; i<elems.length;i++) {
      values.push( encodeURIComponent(elems[i].name) + '=' + encodeURIComponent(elems[i].value) );
    }

    var elems = this.form.getElementsByTagName( "TEXTAREA" );
    for(var i=0; i<elems.length;i++) {
      values.push( elems[i].name + '=' + escape(elems[i].value) );
    }
    
    // add our values
    
    values.push( 'pageid=' + this.page_id );
    values.push( 'viewid=' + this.view_id);
    values.push( 'id=' + this.app_id );
    values.push( 'appid=' + this.app_block_id );
    values.push( 'stripe=' + this.stripe_id );
    values.push( 'placement=' + this.placement );
    values.push( 'container=' + this.container );
    values.push( 'user=' + this.owner );

    values.push( 'task=doajaxsave' );

    values = values.join("&");
    
    content_box = SEMods.B.ge("appcontent_"+this.app_block_id);
    content_box.innerHTML = "Saving...";

    // save may return errors with editing content again
    var ajax = new SEMods.Ajax( this.onEditContentLoadSuccess.bind(this), this.onEditContentSaveFail.bind(this) );
      
      
    ajax.post(SEMods.Apps.api_content_endpoint, values);

    return this._cancelEvent(e);
  },

  _cancelEvent : function(e) {
	  var e = e ? e : window.event;
		  
	  if(e.preventDefault)
		  e.preventDefault();
  
	  if(e.stopPropagation) 
		  e.stopPropagation(); 
  
	  e.cancelBubble = true;
  
	  e.returnValue = false;
	  return false;
  },
  
  onCancel : function() {

    var contentbox = SEMods.B.ge("appcontent_" + this.app_block_id);
    
    SEMods.Apps.ProfileDragDrop.reloadContentEx ( this.app_block_id );
    
  },

  onEditContentSaveSuccess : function(obj, responseText) {
	var r = [];
	try {
	  r = eval('('+responseText+')');
	} catch(e) {
	  r.status = 1;
	  r.html = '';
	};
  
	if(r.status == 0) {
      var contentbox = SEMods.B.ge("appcontent_" + this.app_block_id);
	  contentbox.innerHTML = r.html.replace(/<script(.|\s)*?\/script>/g, "");
    } else {
      apps_show_error_message( r.err_msg ? r.err_msg : '' );
    }
    
  },

  onEditContentSaveFail : function(obj, responseText) {
   apps_show_error_message();
  },
  
  onEditContentLoadSuccess : function(obj, responseText) {
	var r = [];
	try {
	  r = eval('('+responseText+')');
	} catch(e) {
	  r.status = 1;
	  r.html = '';
	};
  
	if(r.status == 0) {
      var contentbox = SEMods.B.ge("appcontent_" + this.app_block_id);
	  contentbox.innerHTML = SEMods.Apps.Utils.parseHTML( r.html );
      
      // hook edit form submit / cancel events

      var elems = contentbox.getElementsByTagName( "FORM" );
      for(var i=0;i<elems.length;i++) {
        if(elems[i].name == "form_editcontent") {
          this.form = elems[i];
          SEMods.B.addEvent( elems[i], "submit", this.onSubmit.bind(this) );
        }
      }

      // form oncancel
      var elems = contentbox.getElementsByTagName( "INPUT" );
      for(var i=0;i<elems.length;i++) {
        if(elems[i].name == "form_editcontent_cancel") {
          SEMods.B.addEvent( elems[i], "click", this.onCancel.bind(this) );
        }
      }
      
	} else {
      apps_show_error_message( r.err_msg ? r.err_msg : '' );
    }
	
  },

  onEditContentLoadFail : function(obj, responseText) {
    apps_show_error_message();
  }

  
}




SEMods.Apps.ProfileDragDrop = function (e) {};

/*
 * stripes - 
 * 
 *
 */

SEMods.Apps.ProfileDragDrop = {
  dropTargets : null,
  stripes : null,          // columns where apps can be placed
  api_endpoint : 'ajax_semods_apps.php?',
  api_content_endpoint : 'appcontent.php?',     // MUST end with "?"
  dropTarget : null,	// rectangular drop box
  objects : [],		// array of boxes, populated on profile.tpl
  stripes_map : [],  // data map stripeid -> stripetype (wide/narrow)
  header_class : 'header',
  page_id : 2, // TBD
  view_id : 0, // TBD
  header_control_element : "TD", // header elements boxes   div(new way) or td (old way)
  enforce_placements : true,    // if force app placements according to supported ones (forced: profile, userhome; not forced: home, ... admin managed)
  auto_save_layout : true,       // auto save layout after box is placed
  flying : false,
  owner : '',        // page owner

  removeApp : function(app_id) {
    var ajax = new SEMods.Ajax( this.onMoveBoxSuccess.bind(this), this.onMoveBoxFail.bind(this) );
	var params = 'task=removeapp&pid=' + this.page_id + '&vid=' + this.view_id + '&appid=' + app_id + '&user=' + this.owner; 
    ajax.post(this.api_endpoint, params );
  },

  removeBox : function(app_id) {
    var ajax = new SEMods.Ajax( this.onMoveBoxSuccess.bind(this), this.onMoveBoxFail.bind(this) );
	var params = 'task=removebox&pid=' + this.page_id + '&vid=' + this.view_id + '&appid=' + app_id + '&user=' + this.owner; 
    ajax.post(this.api_endpoint, params );
  },

  moveBoxToTabs : function(app_id) {
    var ajax = new SEMods.Ajax( this.onMoveBoxSuccess.bind(this), this.onMoveBoxFail.bind(this) );
	var params = 'task=movetotabs&pid=' + this.page_id + '&vid=' + this.view_id + '&appid=' + app_id + '&user=' + this.owner; 
    ajax.post(this.api_endpoint, params );
  },
  
  removeBoxFromTabs : function(app_id) {
    var ajax = new SEMods.Ajax( this.onMoveBoxSuccess.bind(this), this.onMoveBoxFail.bind(this) );
	var params = 'task=removefromtabs&pid=' + this.page_id + '&vid=' + this.view_id + '&appid=' + app_id + '&user=' + this.owner; 
    ajax.post(this.api_endpoint, params );
  },
  
  onMoveBoxSuccess : function(obj, responseText) {
	var r = [];
	try {
	  r = eval('('+responseText+')');
	} catch(e) {
	  r.status = 1;
      r.appid = '';
	};
  
	if(r.status == 0) {
      
      if(r.reload)
        document.location = document.location;

      if(r.url) {
         document.location = r.url;
      }
      
	} else {
      apps_show_error_message( r.err_msg ? r.err_msg : '' );
    }
	
  },

  onMoveBoxFail : function(obj, responseText) {
      apps_show_error_message();
  },
  
  getAppBox : function(app_id) {
    if(app_id.indexOf('_') != -1) {
      app_id = app_id.split('_')[1];
    }
    appbox = SEMods.B.ge('app_'+app_id);
    // try harder
    if(!appbox)
      appbox = SEMods.B.ge('core_'+app_id);
    // try harder
    if(!appbox)
      appbox = SEMods.B.ge('plugin_'+app_id);
    return appbox;
  },
  
  moveToContainer : function(app_id, container, stripe_id) {

   this.buildStripes();

    var stripe;
    for(var i in SEMods.Apps.ProfileDragDrop.stripes) {
      stripe = SEMods.Apps.ProfileDragDrop.stripes[i];
      if(stripe.id == stripe_id && stripe.c == container) {
        elem = this.getAppBox(app_id);
        elem = elem.parentNode.removeChild(elem);
        stripe.e.appendChild( elem );
        box = this.getBoxIdentity(app_id);
        box.container = container;
        box.stripe = stripe_id;
        moved = true;
        break;
      }
    }

    if(moved) {
      if(box.contentvaries) {
        this.reloadContent(app_id, stripe_id, container );
      }
      this.updateLayout(true);
    }
   
  },
  
  buildDropTargets : function() {

	var elem;
	this.dropTargets = new Array();
    for(var obj in this.objects) {
	  
	  // empty box, id not assigned
	  if(!this.objects[obj].box)
		continue;
	  
		elem = this.objects[obj].box;
        
        if(!this.dropTargets[this.objects[obj].container])
         this.dropTargets[this.objects[obj].container] = new Array();
         
        this.dropTargets[this.objects[obj].container].push(
                               { 'x' : SEMods.B.findX(elem),
								 'y' : SEMods.B.findY(elem),
								 'x1': SEMods.B.findX(elem) + elem.offsetWidth,
								 'y1': SEMods.B.findY(elem) + elem.offsetHeight,
								 'e' : elem } );
    }

	return this.dropTargets;
  },
  
  getDropTargets : function(container) {
	return this.dropTargets ? this.dropTargets[container] : this.buildDropTargets();
  },
  
  
  /*
   * find all our elements with attributes "stripe" and "container"
   *
   */ 
  buildStripes : function() {
	this.stripes = [];

    var tdtags = this.getElementsByName_compat( "semods_container", "DIV" );

    for(var tdtag=0;tdtag<tdtags.length;tdtag++) {

      if( tdtags[tdtag].getAttribute('stripe') && tdtags[tdtag].getAttribute('container')) {
         x = SEMods.B.findX(tdtags[tdtag]);
         y = SEMods.B.findY(tdtags[tdtag]);

		var stripe = { 	'x'  : x,
						'y'	 : y,
						'x1' : x + tdtags[tdtag].offsetWidth,
						'y1' : y + tdtags[tdtag].offsetHeight,
						'e'	 : tdtags[tdtag],
                        'id' : tdtags[tdtag].getAttribute('stripe'),
                        'c'  : tdtags[tdtag].getAttribute('container')
                        };
			
         // need this? 
		if(tdtags[tdtag].lastChild) {
		  for(var node = tdtags[tdtag].lastChild; node.previousSibling; node = node.previousSibling) {
			// text
			if(node.nodeType != 3)	{
			  stripe.y1 = SEMods.B.findY(node) + node.offsetHeight;
			  break;
			}
		  }
		} else {
			stripe.y1 = stripe.y + 10;
		}

		this.stripes.push( stripe );
		
	  }
	
	}
	
  },
  
  getStripe : function( x, y ) {
	for(var stripe in this.stripes) {
	  if( (x > this.stripes[stripe].x) && (x < this.stripes[stripe].x1) ) {
		return this.stripes[stripe];
	  }
	}
    
    return null;
  },
  
  getElementsByName_compat : function(name, tag) {
    if(!tag){
      tag = '*';
    }
   
    if(SEMods.B.isIE) {

      var elems = document.getElementsByTagName(tag);
      var res = []
      for(var i=0;i<elems.length;i++) {
        att = elems[i].getAttribute('name');
        if(att == name) {
          res.push(elems[i]);
        }
      }
      return res;
      
    } else {
      return document.getElementsByName(name, tag);
    }
   
   
  },
  
  app_profiledragdrop_onload : function (e, elem) {
	
	// attach events to TD 'header' and build boxes array
	this.dropTargets = new Array();

    var elems = this.getElementsByName_compat( "semods_appbox", "DIV" );
    for(var i=0; i<elems.length; i++) {
    
      var elem;

      var tdtags = elems[i].getElementsByTagName(this.header_control_element);
    
      for(var tdtag=0; tdtag<tdtags.length; tdtag++) {
  
        if(tdtags[tdtag].className == this.header_class) {
          
          // its moveable
          tdtags[tdtag].style.cursor = "move";

          if(SEMods.B.isIE) {
            SEMods.B.addEvent( tdtags[tdtag], "mousedown", function(e) {SEMods.Apps.ProfileDragDrop.app_profiledragdrop_mousedown(e);});
          }
          else {
            SEMods.B.addEvent( tdtags[tdtag], "mousedown", function(e) {SEMods.Apps.ProfileDragDrop.app_profiledragdrop_mousedown(e, this);} );
          }
          
          // add settings box - check if exists first
          if(!this.no_appsettings) {
          
            header_elem = document.createElement("DIV");
            header_elem.className = "apps_settings_titlediv";
            header_elem.innerHTML = tdtags[tdtag].innerHTML;
  
            selem = document.createElement("DIV");
            selem.id = elems[i].id;
            selem.className = "apps_settings";
            if(SEMods.B.isIE) {
              SEMods.B.addEvent( selem, "click", function(e) { var src = (e.srcElement) ? e.srcElement : e.target; app_boxdialog(src.id);} );
            } else {
              SEMods.B.addEvent( selem, "click", function() { app_boxdialog(this.id);} );
            }
                      
            tdtags[tdtag].innerHTML = '';
            tdtags[tdtag].appendChild(header_elem);
            tdtags[tdtag].appendChild(selem);
  
            // if control header is div, make a fix
            if(this.header_control_element == "DIV") {
              clearfix_elem = document.createElement("DIV");
              clearfix_elem.style['clear'] = "both";
              tdtags[tdtag].appendChild(clearfix_elem);
            }

          }
  
          tdtags[tdtag].app_id = elems[i].id;
  
          
          // can be objects dont have this id?
          this.objects[elems[i].id].box = elems[i];
         
         // no need to search further
         break;
        }
        
      } // TD

    } // semods_appbox


  
	// helpers
	var div = document.createElement("DIV");
	div.className = 'app_profiledragdrop_flyingbox';
	div.style.display = 'none'; // or via css
	this.flying_box	= div;
	document.body.insertBefore( div, document.body.firstChild );

	// drop target rectangular box ?
	div = document.createElement("DIV");
    div.className = 'app_profiledragdrop_droptarget';
	this.drop_box = div;
    // borders: -2*2
    // bottom-margin: -10
	
  },
  
  add_new_objects : function( newobjects, options ) {

    if (typeof options == 'undefined' || typeof options.header_class == 'undefined') {
      header_class = "header";
    }

    if (typeof options == 'undefined' || typeof options.header_control_element == 'undefined' ) {
      header_control_element = "TD";
    }

    for(var obj in newobjects) {
      
      var elem = SEMods.B.ge(obj);
      
      if(elem) {
        
        var tdtags = elem.getElementsByTagName(header_control_element);
      
        for(var tdtag=0; tdtag<tdtags.length; tdtag++) {
    
          if(tdtags[tdtag].className == header_class) {
            
            // its moveable
            tdtags[tdtag].style.cursor = "move";
  
            if(SEMods.B.isIE) {
              SEMods.B.addEvent( elem, "mousedown", function(e) {SEMods.Apps.ProfileDragDrop.app_profiledragdrop_mousedown(e);});
            }
            else {
              SEMods.B.addEvent( elem, "mousedown", function(e) {SEMods.Apps.ProfileDragDrop.app_profiledragdrop_mousedown(e, this);} );
            }
  

          // add settings box 
            header_elem = document.createElement("DIV");
            header_elem.className = "apps_settings_titlediv";
            header_elem.innerHTML = tdtags[tdtag].innerHTML;
  
            selem = document.createElement("DIV");
            selem.id = obj;
            selem.className = "apps_settings";
            if(SEMods.B.isIE) {
              SEMods.B.addEvent( selem, "click", function(e) { var src = (e.srcElement) ? e.srcElement : e.target; app_boxdialog(src.id);} );
            } else {
              SEMods.B.addEvent( selem, "click", function() { app_boxdialog(this.id);} );
            }
                      
            tdtags[tdtag].innerHTML = '';
            tdtags[tdtag].appendChild(header_elem);
            tdtags[tdtag].appendChild(selem);
  
            // if control header is div, make a fix
            if(header_control_element == "DIV") {
              clearfix_elem = document.createElement("DIV");
              clearfix_elem.style['clear'] = "both";
              tdtags[tdtag].appendChild(clearfix_elem);
            }
  
  
            tdtags[tdtag].app_id = obj;
            
            // add to global objects list
            this.objects[obj] = newobjects[obj];
            this.objects[obj].box = elem;

            // add callback
            if (typeof options != 'undefined' && typeof options.onDrop != 'undefined' ) {
              this.objects[obj].onDrop = options.onDrop;
            }
      
          }
        }
      }
    }
   
  },
  
  app_profiledragdrop_mousedown : function (e, elem) {
    if(this.flying)
      return;
    
    var src = (e.srcElement) ? e.srcElement : e.target;
    
  
    // click on the injected title div. go one step up
    if(src.className == "apps_settings_titlediv") {
      src = src.parentNode;
    }
    
	// check it's "our" td
	if(!src.app_id)
        return;
      
    new SEMods.Apps.ProfileDragDrop.FlyingBox ( SEMods.Apps.ProfileDragDrop, e, this.objects[src.app_id].box );

    // Page editor hide menu hack
    try {
      if(SEMods.Apps.PageEditor.apps_pageeditmenu_hideall) {
        SEMods.Apps.PageEditor.apps_pageeditmenu_hideall();
      }
    }
    catch(ex) {}
  },
  
  getBoxIdentity : function(id) {
	return this.objects[id];
  },

  showWarningBox : function(x, y, minLeft, maxLeft) {
	if(!this.warning_box) {
	  this.warning_box = SEMods.B.ge("apps_profiledragdrop_warningbox");
	}

	this.warning_box.style.top = y + 30 + 'px';

	SEMods.B.show( this.warning_box );
	
	var boxX = x - this.warning_box.offsetWidth / 2;
	
	
	if((boxX + this.warning_box.offsetWidth + 10)> maxLeft)
	  boxX = maxLeft - this.warning_box.offsetWidth - 10;
	else if(boxX < minLeft)
	  boxX = minLeft + 10;

	this.warning_box.style.left = boxX + 'px';
	

  },

  hideWarningBox : function() {
	if(this.warning_box) {
	  SEMods.B.hide( this.warning_box );
	}
  },
  
  reloadContentEx : function( app_id ) {

   var identity = this.getBoxIdentity( app_id );
   
   this.reloadContent( app_id, identity.stripe, identity.container );
   
  },
  
  // TBD: if multiple apps are loading - how to handle failed callbacks??
   // appid, stripeid, pageid, viewid
  reloadContent : function( app_id, stripe, container ) {

    clean_app_id = SEMods.Apps.cleanAppId(app_id);

   // set "loading"
   content_box = SEMods.B.ge("appcontent_"+app_id);
   content_box.innerHTML = "Loading...";
   
    var ajax = new SEMods.Ajax( this.onReloadContentSuccess.bind(this), this.onReloadContentFail.bind(this) );
      
   // stripe id -> stripe type
   var stripe_type = this.stripes_map[container][stripe];
   var params = 'task=ajaxload&pageid=' + this.page_id + '&viewid=' + this.view_id + '&id=' + clean_app_id + '&appid=' + app_id + '&stripe=' + stripe  + '&placement=' + stripe_type  + '&container=' + container + '&user=' + this.owner;
   ajax.post(this.api_content_endpoint, params );
   
  },
  
  editContent : function( app_id ) {
   
   var identity = this.getBoxIdentity( app_id );
   clean_app_id = SEMods.Apps.cleanAppId(app_id);
   var stripe_type = this.stripes_map[identity.container][identity.stripe];
  
   new SEMods.Apps.ContentEditor( this.page_id,
                                  this.view_id,
                                  clean_app_id,
                                  app_id,
                                  identity.stripe,
                                  stripe_type,
                                  identity.container,
                                  this.owner,
                                  identity.editinplace
                                  );
   
  },

  
  onReloadContentSuccess : function(obj, responseText) {
	var r = [];
	try {
	  r = eval('('+responseText+')');
	} catch(e) {
	  r.status = 1;
	  r.html = '';
      r.appid = '';
	};
  
	if(r.appid != '' && r.html != '') {
	  SEMods.B.ge("appcontent_" + r.appid).innerHTML = SEMods.Apps.Utils.parseHTML( r.html );
	} else {
      apps_show_error_message( r.err_msg ? r.err_msg : '' );
    }
	
  },
  
  
  onReloadContentFail : function(obj, r) {
    apps_show_error_message( r.err_msg ? r.err_msg : '' );
  },
  
 
  updateLayout : function(rebuild_stripes) {

    if(!this.auto_save_layout)
      return;
    
    this._updateLayout(rebuild_stripes);

  },
  
  _updateLayout : function(rebuild_stripes) {

    this.buildLayout();    
	
	var params = 'task=updatelayout&pid=' + this.page_id + '&vid=' + this.view_id  + '&user=' + this.owner + '&layout=' + SEMods.Apps.JSON.encode(this.layout);
    var ajax = new SEMods.Ajax( );
    ajax.post(this.api_endpoint, params );

  },
  
  buildLayout : function() {

    if(!this.stripes)
      this.buildStripes();

    layout = {};
    stripes = SEMods.Apps.ProfileDragDrop.stripes;
	for(var i=0;i<stripes.length;i++) {
	  if(!layout[stripes[i].c])
        layout[stripes[i].c] = [];
      layout[stripes[i].c][""+stripes[i].id] = [];
    }
	  
	var boxes = document.getElementsByName("semods_appbox", "DIV");

	for(var b=0;b<boxes.length;b++) {
      identity = this.getBoxIdentity( boxes[b].id );
      // non existing container (ex: nulltab) - skip. TBD: is this flexible enough? or should we save it as well?
      if(!layout[identity.container] || !layout[identity.container][identity.stripe])
        continue;
	  layout[identity.container][identity.stripe].push( boxes[b].id );
	}

    SEMods.Apps.ProfileDragDrop.layout = layout;
    
  }
  
};





















// master - shortcut for SEMods.Apps.ProfileDragDrop
// e - mouse event
// elem - appbox
//
SEMods.Apps.ProfileDragDrop.FlyingBox = function (master, e, elem) {

  this.disableSelection( elem );
  this.master = master;
  this.master.flying = true;
  
  this.srcElement = elem;
  this.init(e, elem);
  
  // hide all box menus
  if (typeof hideMenu != 'undefined') {
    hideMenuEx();
  }
};


SEMods.Apps.ProfileDragDrop.FlyingBox.prototype = {
  master : null,
  obj : null,
  srcElement : null,
  offsetX : 0,
  offsetY : 0,
  curDropTarget : null,
  identity : [],
  autoScrollSpeed : 10,
  mouseX : 0,
  mouseY : 0,
  mouseDocX : 0,
  mouseDocY : 0,
  lazyMouseY : 0,
  scrollVelocity : 0,
  mouseDownSaver : null,
  

  init: function(e, elem) {

  // rebuild drop targets
    SEMods.Apps.ProfileDragDrop.dropTargets = null;

  // the "stripes" (columns) should be always same width, but for now..
    SEMods.Apps.ProfileDragDrop.buildStripes();

	this.identity = SEMods.Apps.ProfileDragDrop.getBoxIdentity( this.srcElement.id );
	
	//if(this.identity.positionLocked) 
	
	this.createElement(e);
	
	this.documentHeight = document.documentElement.clientHeight;	
	this.documentScrollHeight = document.documentElement.scrollHeight + 100 + this.obj.offsetHeight;

	
    this._addEvent( document.body, "mouseup", this.onMouseUp.bind(this) );
    //this._addEvent( document.body, "dragend", this.onMouseUp.bind(this) );

	document.body.selectstart = function() { return false; };
	// ?
    this._addEvent( document.body, "selectstart", function() { return false; } );
//    this.disableSelection( document.body );

    this._addEvent( document.body, "mousemove", this.onMouseMove.bind(this) );
    //this._addEvent( document.body, "drag", this.onMouseMove.bind(this) );
	
	// THIS ONE DISABLES TEXT SELECTON (opera)
	this.mouseDownSaver = document.onmousedown;
	document.onmousedown = function() { return false; };
  },
  
  disableSelection : function (element) {
    this.eventsaver_onselectstart = element.onselectstart;
    element.onselectstart = function() {return false;};
    element.unselectable = "on";
    element.style.MozUserSelect = "none";
  },

  enableSelection : function ( element ) {
    element.onselectstart = this.eventsaver_onselectstart;
    element.unselectable = "off";
    element.style.MozUserSelect = "";
  },

  autoScroll : function(e) {
	
	// opera auto scrolls by itself
	if(SEMods.Browser.isOpera)
	  return;
	
	if(e.clientY<50 || e.clientY>(this.documentHeight-50)){
		if(e.clientY<50 && !this.autoScrollActive){
			this.autoScrollActive = true;
			this.scrollVelocity = this.autoScrollSpeed*-1;
			setTimeout(this.autoScroller.bind(this), 5);
		}
		
		if(e.clientY>(this.documentHeight-50) && document.documentElement.scrollHeight<=this.documentScrollHeight && !this.autoScrollActive){
			this.autoScrollActive = true;
			this.scrollVelocity = this.autoScrollSpeed;
			setTimeout(this.autoScroller.bind(this), 5);
		}
	}else{
		this.autoScrollActive = false;
	}		

	
  },         
  
  autoScroller : function(direction,yPos) {
		  
	if(document.documentElement.scrollHeight>this.documentScrollHeight && this.scrollVelocity>0)return;
	window.scrollBy(0,this.scrollVelocity);
	if(!this.obj)return;

	if(this.scrollVelocity<0){
		if(document.documentElement.scrollTop>0){
			//this.obj.style.top = (el_y - mouse_y + yPos + document.documentElement.scrollTop) + 'px';		
			this.obj.style.top = parseInt(this.obj.style.top) + this.scrollVelocity + 'px';
			this.lazyMouseY += this.scrollVelocity;
		}else{
			this.autoScrollActive = false;
		}
	}else{
//		if(yPos>(this.documentHeight-50)){	
		if(this.mouseY>(this.documentHeight-50)){	
//			dragObject.style.top = (el_y - mouse_y + yPos + document.documentElement.scrollTop) + 'px';			
			this.obj.style.top = parseInt(this.obj.style.top) + this.scrollVelocity + 'px';		
			this.lazyMouseY += this.scrollVelocity;
		}else{
            
			this.autoScrollActive = false;
		}
	}
	
	this.mouseMoveHandler( this.mouseDocX, this.mouseDocY + this.lazyMouseY );
	
	if(this.autoScrollActive)setTimeout(this.autoScroller.bind(this), 5);
  },


  

  
  createElement : function(e) {

	this.master.flying_box.style.width = this.srcElement.offsetWidth + 'px';
	this.master.flying_box.style.height = this.srcElement.offsetHeight + 'px';
	this.master.flying_box.style.display = 'block';
	
    this.master.drop_box.style.height = (this.srcElement.offsetHeight > 200 ? 200 : this.srcElement.offsetHeight) + 'px';

    this.master.drop_box.style.width = '99%';
                    
	this.master.flying_box.style.left = SEMods.B.findX( this.srcElement ) + 'px';
	this.master.flying_box.style.top = SEMods.B.findY( this.srcElement ) + 'px';
	
	this.offsetX = SEMods.B.mousePosX(e) - SEMods.B.findX( this.srcElement ); 
	this.offsetY = SEMods.B.mousePosY(e) - SEMods.B.findY( this.srcElement );
	
    // check if possibly dragging from top bar appslist which has fixed position
    // 30 - approx size of header

    if(Math.abs(this.offsetY) > 30) {

      // fix scroll
      var scrollTop = 0;
      var scrollLeft = 0;
      obj = this.srcElement;
      if (obj.parentNode) {
        while (obj.parentNode) {
          scrollTop += obj.scrollTop;
          scrollLeft += obj.scrollLeft;
          obj = obj.parentNode;
        }
      }
      
      this.offsetY += scrollTop;
      this.offsetX += scrollLeft;

      this.offsetX -= (document.documentElement && document.documentElement.scrollTop) ? 2*document.documentElement.scrollLeft : 2*document.body.scrollLeft;
      this.offsetY -= (document.documentElement && document.documentElement.scrollTop) ? 2*document.documentElement.scrollTop : 2*document.body.scrollTop;
    }
    
    // if still miss, just center it
    if(Math.abs(this.offsetY) > 30) {
      this.offsetY = 15;
    }
    
	this.obj = this.master.flying_box;
    
    this.curDropTarget = this.master.drop_box;
	this.curDropTarget.stripe = this.master.objects[this.srcElement.id].stripe;
	this.curDropTarget.container = this.master.objects[this.srcElement.id].container;

    this.master.flying_box.appendChild( this.srcElement.parentNode.replaceChild( this.master.drop_box, this.srcElement ) );
	
  },
  
  
  mouseMoveHandler : function(x, y) {
	
    if(!SEMods.Apps.ProfileDragDrop.lock_vertical_move) {
      this.obj.style.left = x - this.offsetX + 'px';
    }
	this.obj.style.top = y - this.offsetY + 'px';
  
	// check if supports landing on this stripe
	var stripe = SEMods.Apps.ProfileDragDrop.getStripe( x, y );
    if(stripe == null)
      return;

	var stripe_id = stripe.id;

    if(SEMods.Apps.ProfileDragDrop.enforce_placements) {
      if(this.identity.stripes.in_array(stripe_id) && (this.identity.container == stripe.c)) {
        SEMods.Apps.ProfileDragDrop.hideWarningBox();
      } else {
        SEMods.Apps.ProfileDragDrop.showWarningBox( x, y - this.offsetY, x - this.offsetX, x - this.offsetX + this.obj.offsetWidth );
        return;
      }
    }
	
	var elem = null;

	var targetX, targetY;
	var target;
	var found_placement = false;

    // if inside curdroptarget - nothing
    var curDropTargetX = SEMods.B.findX( this.curDropTarget );
    var curDropTargetY =  SEMods.B.findY( this.curDropTarget );

    if( (x >= curDropTargetX) && (x <= curDropTargetX+this.curDropTarget.offsetWidth) && (y >= curDropTargetY) && (y <= curDropTargetY+this.curDropTarget.offsetHeight) ) {
      return;
    }
    
	
    // TBD: drop on other container - ex: admin of tabbed profile layout
	var targets = SEMods.Apps.ProfileDragDrop.getDropTargets(this.identity.container);

	for(var i=0; i<targets.length; i++) {
	  target = targets[i];
	  if(this.srcElement == target.e)
		continue;
	
		targetX = SEMods.B.findX( target.e );
		targetY =  SEMods.B.findY( target.e );

	  // inside the box width
	  if( (x >= targetX) && (x <= targetX + target.e.offsetWidth)) {
		
		// top half
		if( (y > (targetY-20)) && (y < (targetY + target.e.offsetHeight/2))) {
		  found_placement = true;

          // thats us
          if(this.curDropTarget != target.e.previousSibling ) {
            target.e.parentNode.insertBefore( this.curDropTarget, target.e );
          }
		  break;
		}
  
		// bottom half
		if( (y >= (targetY + target.e.offsetHeight/2) ) && (y <= (targetY + target.e.offsetHeight))) {
		  found_placement = true;

		  if(target.e.nextSibling) {
            //console.log( this.curDropTarget == target.e.nextSibling );
            if(this.curDropTarget != target.e.nextSibling) {
              target.e.parentNode.insertBefore( this.curDropTarget, target.e.nextSibling );
            }
		  } else {
            //console.log( this.curDropTarget == target.e.previousSibling );
			target.e.parentNode.appendChild( this.curDropTarget, target.e );
		  }
		  break;
		}
		
	  }
	}

   var node = null;
   
	// try on stripes - in boundaries
	if(!found_placement) {
      for(var i=0; i<SEMods.Apps.ProfileDragDrop.stripes.length; i++) {
		stripe = SEMods.Apps.ProfileDragDrop.stripes[i];

		if( (x >= stripe.x) && (x <= stripe.x1) && (y >= stripe.y) && (y <= stripe.y+stripe.e.offsetHeight) ) {

		  // find bottom elem
		  
		  var y1=stripe.y;
            for(var i=stripe.e.childNodes.length-1; i>=0; i--) {
              node = stripe.e.childNodes[i];
              // element node
              // added name check
              if(node.nodeType == 1) {
                y1 = SEMods.B.findY(node) + node.offsetHeight;
                break;
              }
            }
		  
		  if( y > y1 ) {
			
            if(node != this.curDropTarget) {
              stripe.e.appendChild( this.curDropTarget );
            }
            found_placement = true;
            break;
			  
		  }
          
          // if nothing satisfied, put as a top item
         if(stripe.e.firstChild != this.curDropTarget) {
            stripe.e.insertBefore( this.curDropTarget, stripe.e.firstChild );
            found_placement = true;
            break;
         }

        }
      }
    }


	// try on stripes - out of boundaries
	if(!found_placement) {
      for(var i=0; i<SEMods.Apps.ProfileDragDrop.stripes.length; i++) {
		stripe = SEMods.Apps.ProfileDragDrop.stripes[i];

		if( (x >= stripe.x) && (x <= stripe.x1) ) {
        
         if (y <= stripe.y) {

            if(stripe.e.firstChild != this.curDropTarget) {
               stripe.e.insertBefore( this.curDropTarget, stripe.e.firstChild );
            }
            
         } else if (y >= stripe.y+stripe.e.offsetHeight) {

            if(stripe.e.lastChild != this.curDropTarget) {
               stripe.e.appendChild( this.curDropTarget );
            }

         }
         

         found_placement = true;
         break;
        }
      }
    }


   var node = null;

	if(found_placement) {
	  this.curDropTarget.stripe = stripe_id;
	  this.curDropTarget.container = stripe.c;  // hmm?
	}


  // hack test
	//return this._cancelEvent(e);

  },

  onMouseMove : function(e) {
    
    //console.debug("mousemove");
    
	var x = SEMods.B.mousePosX(e);
	var y = SEMods.B.mousePosY(e);

	this.lazyMouseY = 0;
	this.mouseX = e.clientX;
	this.mouseY = e.clientY;

	this.mouseDocX = x;
	this.mouseDocY = y;


	this.mouseMoveHandler( x, y );
	this.autoScroll(e);
	
	return this._cancelEvent(e);
  
  },
 
  onMouseUp : function(e) {
	
	if (!e) var e = window.event;
	var src = (e.srcElement) ? e.srcElement : e.target;

	if(this.curDropTarget) {
    
      if(this.identity.stripe != this.curDropTarget.stripe) {
         stripe_switched = true;
      } else {
         stripe_switched = false;
      }
      this.curDropTarget.parentNode.replaceChild( this.srcElement, this.curDropTarget );
	  this.master.flying_box.style.display = 'none';
	  this.identity.stripe = this.curDropTarget.stripe;
      
      // NOTE: this is needed in admin remix, but currently user can't drag between containers (!)
	  this.identity.container = this.curDropTarget.container;
	  
	}
	
	SEMods.Apps.ProfileDragDrop.hideWarningBox();
	
    this.master.flying = false;

    this._removeEvent( document.body, "mouseup" );
    this._removeEvent( document.body, "dragend" );

    this._removeEvent( document.body, "mousemove" );
    this._removeEvent( document.body, "drag" );

    this._removeEvent( document.body, "selectstart" );

    this.enableSelection( this.srcElement );
    
	document.onmousedown = this.mouseDownSaver;

    if(stripe_switched && this.identity.contentvaries) {
      // appid, stripeid, pageid, viewid
       SEMods.Apps.ProfileDragDrop.reloadContent(this.srcElement.id, this.identity.stripe, this.identity.container);
    }
    
    if(this.identity.onDrop) {
      this.identity.onDrop(this.identity);
    }
    
    SEMods.Apps.ProfileDragDrop.updateLayout();
  },

  _addEvent : function($obj, $event, $handler) {
	  var fn = $handler;
  
	  if (!$obj.attachedEvents)
		  $obj.attachedEvents = new Array();
  
	  if ($obj.attachedEvents[$event])
		  this._removeEvent($obj, $event);
  
	  $obj.attachedEvents[$event] = fn;
  
	  if (typeof $obj.addEventListener != 'undefined') 
		  $obj.addEventListener($event, $handler, false);
	  else if (typeof $obj.attachEvent != 'undefined') 
		  $obj.attachEvent('on' + $event, $handler);
  },

  _removeEvent : function($obj, $event) {
	  if (!$obj.attachedEvents || !$obj.attachedEvents[$event])
		  return;
  
	  if (typeof $obj.removeEventListener != 'undefined') 
		  $obj.removeEventListener($event, $obj.attachedEvents[$event], false);
	  else if (typeof $obj.detachEvent != 'undefined') 
		  $obj.detachEvent('on' + $event, $obj.attachedEvents[$event]);
  },

  _cancelEvent : function(e) {
	  var e = e ? e : window.event;
		  
	  if(e.preventDefault)
		  e.preventDefault();
  
	  if(e.stopPropagation) 
		  e.stopPropagation(); 
  
	  e.cancelBubble = true;
  
	  e.returnValue = false;
	  return false;
  }
  
}





/* JSON ENCODER */

SEMods.Apps.JSON = new function(){

	this.encode = function(){
		var	self = arguments.length ? arguments[0] : this,
			result, tmp;
		if(self === null)
			result = "null";
		else if(self !== undefined && (tmp = $[typeof self](self))) {
			switch(tmp){
				case	Array:
					result = [];
					for(var	i = 0, j = 0, k = self.length; j < k; j++) {
						if(self[j] !== undefined && (tmp = JSON.encode(self[j])))
							result[i++] = tmp;
					};
					result = "[".concat(result.join(","), "]");
					break;
				case	Boolean:
					result = String(self);
					break;
				case	Date:
					result = '"'.concat(self.getFullYear(), '-', d(self.getMonth() + 1), '-', d(self.getDate()), 'T', d(self.getHours()), ':', d(self.getMinutes()), ':', d(self.getSeconds()), '"');
					break;
				case	Function:
					break;
				case	Number:
					result = isFinite(self) ? String(self) : "null";
					break;
				case	String:
					result = '"'.concat(self.replace(rs, s).replace(ru, u), '"');
					break;
				default:
					var	i = 0, key;
					result = [];
					for(key in self) {
						if(self[key] !== undefined && (tmp = JSON.encode(self[key])))
							result[i++] = '"'.concat(key.replace(rs, s).replace(ru, u), '":', tmp);
					};
					result = "{".concat(result.join(","), "}");
					break;
			}
		};
		return result;
	};
	
	/*
	Method: toDate
		transforms a JSON encoded Date string into a native Date object.
	
	Arguments:
		[String/Number] - Optional JSON Date string or server time if this method is not a String prototype. Server time should be an integer, based on seconds since 1970/01/01 or milliseconds / 1000 since 1970/01/01.
	
	Returns:
		Date - Date object or undefined if string is not a valid Date
	
	Example [Basic]:
		>var	serverDate = JSON.toDate("2007-04-05T08:36:46");
		>alert(serverDate.getMonth());	// 3 (months start from 0)
	
	Example [Prototype]:
		>String.prototype.parseDate = JSON.toDate;
		>
		>alert("2007-04-05T08:36:46".parseDate().getDate());	// 5
	
	Example [Server Time]:
		>var	phpServerDate = JSON.toDate(<?php echo time(); ?>);
		>var	csServerDate = JSON.toDate(<%=(DateTime.Now.Ticks/10000-62135596800000)%>/1000);
	
	Example [Server Time Prototype]:
		>Number.prototype.parseDate = JSON.toDate;
		>var	phpServerDate = (<?php echo time(); ?>).parseDate();
		>var	csServerDate = (<%=(DateTime.Now.Ticks/10000-62135596800000)%>/1000).parseDate();
	
	Note:
		This method accepts an integer or numeric string too to mantain compatibility with generic server side time() function.
		You can convert quickly mtime, ctime, time and other time based values.
		With languages that supports milliseconds you can send total milliseconds / 1000 (time is set as time * 1000)
	*/
	this.toDate = function(){
		var	self = arguments.length ? arguments[0] : this,
			result;
		if(rd.test(self)){
			result = new Date;
			result.setHours(i(self, 11, 2));
			result.setMinutes(i(self, 14, 2));
			result.setSeconds(i(self, 17, 2));
			result.setMonth(i(self, 5, 2) - 1);
			result.setDate(i(self, 8, 2));
			result.setFullYear(i(self, 0, 4));
		}
		else if(rt.test(self))
			result = new Date(self * 1000);
		return result;
	};
	
	/* Section: Properties - Private */
	
	/*
	Property: Private
	
	List:
		Object - 'c' - a dictionary with useful keys / values for fast encode convertion
		Function - 'd' - returns decimal string rappresentation of a number ("14", "03", etc)
		Function - 'e' - safe and native code evaulation
		Function - 'i' - returns integer from string ("01" => 1, "15" => 15, etc)
		Array - 'p' - a list with different "0" strings for fast special chars escape convertion
		RegExp - 'rc' - regular expression to check JSON strings (different for IE5 or old browsers and new one)
		RegExp - 'rd' - regular expression to check a JSON Date string
		RegExp - 'rs' - regular expression to check string chars to modify using c (char) values
		RegExp - 'rt' - regular expression to check integer numeric string (for toDate time version evaluation)
		RegExp - 'ru' - regular expression to check string chars to escape using "\u" prefix
		Function - 's' - returns escaped string adding "\\" char as prefix ("\\" => "\\\\", etc.)
		Function - 'u' - returns escaped string, modifyng special chars using "\uNNNN" notation
		Function - 'v' - returns boolean value to skip object methods or prototyped parameters (length, others), used for optional decode filter function
		Function - '$' - returns object constructor if it was not cracked (someVar = {}; someVar.constructor = String <= ignore them)
		Function - '$$' - returns boolean value to check native Array and Object constructors before convertion
	*/
	var	c = {"\b":"b","\t":"t","\n":"n","\f":"f","\r":"r",'"':'"',"\\":"\\","/":"/"},
		d = function(n){return n<10?"0".concat(n):n},
		e = function(c,f,e){e=eval;delete eval;if(typeof eval==="undefined")eval=e;f=eval(""+c);eval=e;return f},
		i = function(e,p,l){return 1*e.substr(p,l)},
		p = ["","000","00","0",""],
		rc = null,
		rd = /^[0-9]{4}\-[0-9]{2}\-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}$/,
		rs = /(\x5c|\x2F|\x22|[\x0c-\x0d]|[\x08-\x0a])/g,
		rt = /^([0-9]+|[0-9]+[,\.][0-9]{1,3})$/,
		ru = /([\x00-\x07]|\x0b|[\x0e-\x1f])/g,
		s = function(i,d){return "\\".concat(c[d])},
		u = function(i,d){
			var	n=d.charCodeAt(0).toString(16);
			return "\\u".concat(p[n.length],n)
		},
		v = function(k,v){return $[typeof result](result)!==Function&&(v.hasOwnProperty?v.hasOwnProperty(k):v.constructor.prototype[k]!==v[k])},
		$ = {
			"boolean":function(){return Boolean},
			"function":function(){return Function},
			"number":function(){return Number},
			"object":function(o){return o instanceof o.constructor?o.constructor:null},
			"string":function(){return String},
			"undefined":function(){return null}
		},
		$$ = function(m){
			function $(c,t){t=c[m];delete c[m];try{e(c)}catch(z){c[m]=t;return 1}};
			return $(Array)&&$(Object)
		};
	try{rc=new RegExp('^("(\\\\.|[^"\\\\\\n\\r])*?"|[,:{}\\[\\]0-9.\\-+Eaeflnr-u \\n\\r\\t])+?$')}
	catch(z){rc=/^(true|false|null|\[.*\]|\{.*\}|".*"|\d+|\d+\.\d+)$/}
};







/*** PAGE EDITOR ***/









SEMods.Apps.PageEditor = function() {};

SEMods.Apps.PageEditor = {
  apps_pagemenu_active : null,
  layout : {},
  page_id : 0,
  view_id : 0,
  editor_elem : null,
  editor_elem_html : '',
  editor_elem_slide_direction : 0,
  slide_timer : 0,
  slide_chain : [],
  status : 0,   // 0 - unloaded, 1 - loading, 2 - loaded
  designmode : 0, // 0 - no, 1 - full, 2 - mini

  pageeditor_slide : function() {
  
    var m = parseInt(this.editor_elem.style.top);
    var delta = Math.round(Math.max(2, Math.min(12, Math.abs(m)/3))) ;

    // slideout
    if(this.editor_elem_slide_direction == 0) {

      if(m >= 0) {
        this.slide_timer = 0;
        
        next = this.slide_chain.pop();
        if(next) {
          next();
        }
        return;
      }

    } else {
      
      if(m <= -this.editor_elem.offsetHeight) {
        this.slide_timer = 0;

        next = this.slide_chain.pop();
        if(next) {
          next();
        }

        return;
      }
      
      delta = -delta;
      
    }
    this.editor_elem.style.top = m + delta + "px";
    
    this.slide_timer = setTimeout(this.pageeditor_slide.bind(this), 50);
  },

  load_page_editor : function (page_id, view_id) {

    if(this.status > 0)
      return;
    
    this.status = 1;  // loading
    
    this.editor_elem = document.createElement("DIV");
    this.editor_elem.id = "pageeditor_wrapper";
    this.editor_elem.innerHTML = "<div id='pageeditor_topbar' Xstyle='height:30px'><div style='padding: 5px'><img style='float:left;margin-right: 4px' src='./images/apps_ajaxprogress1.gif'>Loading...</div></div>";
    
    //editor_elem.style.display = "none";
    this.editor_elem.style.top = -100 + 'px';
    
    
    document.body.appendChild(this.editor_elem);
    this.editor_elem.style.top = -this.editor_elem.offsetHeight + 'px';
    this.slide_timer = setTimeout(this.pageeditor_slide.bind(this), 50);
  
    this.page_id = page_id;
    this.view_id = view_id;
    var ajax = new SEMods.Ajax( this.onLayoutPageEditorSuccess.bind(this), this.onLayoutPageEditorFail.bind(this) );
    var params = 'task=loadpageeditor&pid=' + this.page_id + '&vid=' + this.view_id + '&user=' + SEMods.Apps.ProfileDragDrop.owner; 
    ajax.post(SEMods.Apps.api_endpoint, params );
  },
  
  
  onAppPlaceCallback : function(identity) {
    
    // not dropped anywhere on the page
    if(identity.stripe == -1) {
      return;
    }
      
    // already in place
    if(identity.placed) {
      return;
    }
    
    identity.placed = true;
    
    SEMods.Apps.placeApp( identity.id, 1, SEMods.Apps.ProfileDragDrop.page_id, SEMods.Apps.ProfileDragDrop.view_id, SEMods.Apps.PageEditor.onAppPlaceFinished );

  },

  onAppPlaceFinished : function(app_id) {
    SEMods.Apps.ProfileDragDrop.updateLayout();
    // full design - load content
    if(SEMods.Apps.PageEditor.designmode == 1) {
      SEMods.B.show('appcontent_'+app_id);
      SEMods.Apps.ProfileDragDrop.reloadContentEx ( app_id );
    }
  },
  
  onLayoutPageEditorSuccess : function(obj, responseText) {
	var r = [];
	try {
	  r = eval('('+responseText+')');
	} catch(e) {
	  r.status = 1;
	};

    this.slide_chain.unshift( function() {this.editor_elem_slide_direction = 1; this.slide_timer = setTimeout(this.pageeditor_slide.bind(this), 50); }.bind(this) );
  
	if(r.status == 0) {
      
      this.layout = r.layout;
      this.page_id = r.layout.page_id;
      this.view_id = r.layout.view_id;
      this.status = 2;

      this.editor_elem_html = r.html;
      
      this.slide_chain.unshift( function() { this.editor_elem_slide_direction = 0; this.editor_elem.innerHTML = this.editor_elem_html; SEMods.Apps.ProfileDragDrop.add_new_objects( this.layout.newobjects, {'onDrop' : SEMods.Apps.PageEditor.onAppPlaceCallback } ); this.slide_timer = setTimeout(this.pageeditor_slide.bind(this), 50); }.bind(this) );

      // pull out settings boxes to prevent weird positioning problem
      this.slide_chain.unshift( function() { var elem = SEMods.B.ge("pageeditor_appsettings");if(elem) { document.body.appendChild( elem.parentNode.removeChild( elem ) );}}.bind(this) );

	} else {

      this.status = 0;
      apps_show_error_message( r.err_msg ? r.err_msg : '' );

    }
    
    
    if(this.slide_timer == 0) {
      var func = this.slide_chain.pop()
      func();
    }

  },

  onLayoutPageEditorFail : function(obj, responseText) {

      apps_show_error_message();
  },
  
  save_layout : function() {
    var ajax = new SEMods.Ajax( this.onSaveLayoutSuccess.bind(this), this.onSaveLayoutFail.bind(this) );
    var params = 'task=savepagelayout&pid=' + this.page_id + '&vid=' + this.view_id + '&user=' + SEMods.Apps.ProfileDragDrop.owner;
    params += '&layout=' + SEMods.Apps.JSON.encode(this.layout);
    ajax.post(SEMods.Apps.api_endpoint, params );
  },

  onSaveLayoutSuccess : function(obj, responseText) {
	var r = [];
	try {
	  r = eval('('+responseText+')');
	} catch(e) {
	  r.status = 1;
	};
      
	if(r.status == 0) {
      document.location = document.location;
	} else {
      apps_show_error_message( r.err_msg ? r.err_msg : '' );
    }
  },

  onSaveLayoutFail : function(obj, responseText) {
      apps_show_error_message();
  },
  
  apps_layoutmenu_onclick : function(id) {

    if(!SEMods.B.ge('widget_'+id).disabled) {
      SEMods.B.ge('widget_'+id).checked = !SEMods.B.ge('widget_'+id).checked;
      this.layout.widgets[id] = SEMods.B.ge('widget_'+id).checked*1;
    }

  },
  
  apps_pageeditmenu_onclick : function(id) {

    var apps_pagemenu_wasactive = this.apps_pagemenu_active;
    this.apps_pageeditmenu_hideall();
    if(apps_pagemenu_wasactive != id) {
      SEMods.B.ge("menubutton_"+id).className = "pageeditor_button_active";
      SEMods.B.show("pageeditor_menu_"+id);
      this.apps_pagemenu_active = id;
    }
  },
  
  apps_pageeditmenu_hideall : function() {
    if(this.apps_pagemenu_active) {
      SEMods.B.ge("menubutton_"+this.apps_pagemenu_active).className = "pageeditor_button";
      SEMods.B.hide("pageeditor_menu_"+this.apps_pagemenu_active);
      this.apps_pagemenu_active = null;
    }
  },
  
  apps_layout_select : function (id) {
    var elems = SEMods.Apps.ProfileDragDrop.getElementsByName_compat("apps_layout_selector", "A");
    for(var i=0;i<elems.length;i++) {
      elems[i].className = "ymenu_item layout_unselected";
    }
    SEMods.B.ge("apps_layout_selector_"+id).className = "ymenu_item layout_selected";
    this.layout.layout_id = id;
  },

  _cancelEvent : function(e) {
	  var e = e ? e : window.event;
		  
	  if(e.preventDefault)
		  e.preventDefault();
  
	  if(e.stopPropagation) 
		  e.stopPropagation(); 
  
	  e.cancelBubble = true;
  
	  e.returnValue = false;
	  return false;
  }
  
}








/* PAGINATOR */

SEMods.Paginator = function(ajax_endpoint, total_items, nohide) {
  this.ajax_endpoint = ajax_endpoint;
  this.total_items = total_items;
  if(nohide) this.nohide = true;
}

SEMods.Paginator.prototype = {
  obj : null,
  ajax_endpoint : '',
  current_page : 1,
  total_items : 1,
  last_visible_item : 1,
  ajaxProgressElem : 'paginator_ajax_progress',
  ajaxContentElem : 'ajax_content',
  nohide : false,
  params : '',
  onError_callback : null,
  
  set_url : function(url) {
    this.ajax_endpoint = url;
  },
  
  set_params : function(params) {
    this.params = params;
  },
  
  paginate_left : function () {
	SEMods.B.ge("left_paginator").blur();
	
	if(this.current_page == 1)
	  return false;
	
	this.paginate(this.current_page - 1);
  },

  paginate_right : function () {
	SEMods.B.ge("right_paginator").blur();
  
	if(this.total_items == this.last_visible_item)
	  return false;
  
    this.paginate(this.current_page + 1);
  },

  paginate : function (page) {
	SEMods.B.toggle( this.ajaxProgressElem, this.ajaxContentElem );
  
	var ajax = new SEMods.Ajax( this.onPaginateSuccess.bind(this), this.onPaginateFail.bind(this) );
	
	var params = "task=getitems" + "&p=" + page + this.params;
	
	ajax.post( this.ajax_endpoint,  params );
  
  },
  
  refresh : function() {
    this.paginate( this.current_page );
  },
  
  hideAll : function() {
	SEMods.B.hide( this.ajaxProgressElem, this.ajaxContentElem, "paginator" );
  },

  showAll : function() {
	SEMods.B.show( this.ajaxContentElem );
	if((this.current_page == 1) && (this.last_visible_item == this.total_items)) {
	  
	}
	else
	  SEMods.B.show("paginator");
	  
  },

  onPaginateSuccess : function (ajaxObj, responseText) {
	var r = [];
	try {
	  r = eval('('+responseText+')');
	  
	} catch(e) {
	  r.status = 1;
	  r.html = 'Error loading content.';
	};
    
    // firefox
    if(typeof r != 'object') {
      r = [];
	  r.status = 1;
	  r.html = 'Error loading content.';
    }
  
	if(r.status == 0) {
	  this.current_page = r.page;
	  this.total_items = r.total;
	  this.last_visible_item = r.to;
	  
	  SEMods.B.ge("page_from").innerHTML = r.from;
	  SEMods.B.ge("page_to").innerHTML = r.to;
	  SEMods.B.ge("total_items").innerHTML = r.total;
	  
	  if(this.total_items == 0) {
		//SEMods.B.hide("voter_votes");
		//SEMods.B.show("voter_no_votes");
	  } else {
  
		//SEMods.B.show("voter_votes");
		//SEMods.B.hide("voter_no_votes");
  
		if((this.current_page == 1) && (this.last_visible_item == this.total_items)) {
		  if(!this.nohide)
            SEMods.B.hide("paginator");
		}
		else {
		  SEMods.B.show("paginator");
		}
		
	  }
	  
	  if(this.current_page == 1) {
		SEMods.B.ge("left_paginator").className = "paginator_disabled";
	  }
	  else {
		SEMods.B.ge("left_paginator").className = "";
	  }
  
	  if(r.total == r.to) {
		SEMods.B.ge("right_paginator").className = "paginator_disabled";
	  }
	  else {
		SEMods.B.ge("right_paginator").className = "";
	  }
	} else if(this.onError_callback) {
      this.onError_callback();
	}
	
	SEMods.B.ge( this.ajaxContentElem ).innerHTML = r.html;
	SEMods.B.toggle( this.ajaxProgressElem, this.ajaxContentElem )
  },

  onPaginateFail : function (ajaxObj, respText) {
	SEMods.B.ge( this.ajaxContentElem ).innerHTML = "Error";
	SEMods.B.toggle( this.ajaxProgressElem, this.ajaxContentElem )

	if(this.onError_callback) {
      this.onError_callback();
    }
  }
  
}
/* smoothboxEx.js start *//*
 * Smoothbox v20080623 by Boris Popoff (http://gueschla.com)
 * To be used with mootools 1.2
 *
 * Based on Cody Lindley's Thickbox, MIT License
 *
 * Licensed under the MIT License:
 *   http://www.opensource.org/licenses/mit-license.php
 */

// on page load call TBEX_init
window.addEvent('domready', TBEX_init);

// prevent javascript error before the content has loaded
TBEX_WIDTH = 0;
TBEX_HEIGHT = 0;
var TBEX_doneOnce = 0;

// add smoothbox to href elements that have a class of .smoothbox
function TBEX_init(){
	$$("a.smoothbox").each(function(el){el.onclick=TBEX_bind});
}

function TBEX_bind(event){
	var event = new Event(event);
	// stop default behaviour
	event.preventDefault();
	// remove click border
	this.blur();
	// get caption: either title or name attribute
	var caption = this.title || this.name || "";
	// get rel attribute for image groups
	var group = this.rel || false;
	// display the box for the elements href
	TBEX_show(caption, this.href, group);
    this.onclick = TBEX_bind;
    return false;
}

// called when the user clicks on a smoothbox link
function TBEX_show(caption, url, rel, loading, disable_close) {

  // set default closing mechanism
  if(!disable_close) { disable_close = 0; }

  // create iframe, overlay and box if non-existent
  if (!$("TBEX_overlay")) {
    new Element('div').setProperty('id', 'TBEX_overlay').inject(document.body);
    $('TBEX_overlay').setOpacity(0.6);
  }

  if (!$("TBEX_window")) {
    new Element('div').setProperty('id', 'TBEX_window').inject(document.body);
    $('TBEX_window').setOpacity(0);
  }
  else 
  {
    $('TBEX_window').dispose();
	// SEMODS also kill TB
	if($('TB_window')) {
		$('TB_window').dispose();
	}
    new Element('div').setProperty('id', 'TBEX_window').inject(document.body);
    $('TBEX_window').setOpacity(0);
  }

	if (!$("TBEX_load")) {
	  new Element('div').setProperty('id', 'TBEX_load').inject(document.body);
	  $('TBEX_load').innerHTML = "<img src='./images/tbex_loadingAnimation.gif' alt='Loading' />";
	}
	//$('TBEX_load').show();
	$('TBEX_load').setStyle('display','block');
	//document.getElementByID('TBEX_load').style.display = "";

  if(disable_close == 0) { $("TBEX_overlay").onclick=TBEX_remove; } else { $("TBEX_overlay").onclick = ''; }
  //window.onscroll = TBEX_position;
    
  // check if a query string is involved
  var baseURL = url.match(/(.+)?/)[1] || url;
    
  // CODE TO SHOW IFRAME
  var queryString = url.match(/\?(.+)/)[1];
  var params = TBEX_parseQuery(queryString);
    
	// autosize - fullscreen   
  if(!params['width'] || !params['height']) {
//      TBEX_HEIGHT = (document.all?document.body.parentNode.clientHeight:window.innerHeight) - 20;
      TBEX_HEIGHT = (document.all?document.documentElement.clientHeight:window.innerHeight) - 20;
      TBEX_WIDTH  = (document.all?document.body.clientWidth:window.innerWidth) - 40;
  } else {
	TBEX_WIDTH = (params['width'] * 1) + 30;
	TBEX_HEIGHT = (params['height'] * 1) + 40;
  }
        
  var ajaxContentW = TBEX_WIDTH - 30, ajaxContentH = TBEX_HEIGHT - 45;

  if (url.indexOf('TBEX_iframe') != -1) {
    urlNoQuery = url.split('TBEX_');
    $("TBEX_window").innerHTML += "<div id='TBEX_title'><div id='TBEX_ajaxWindowTitle'>" + caption + "</div><div id='TBEX_closeAjaxWindow'><a href='#' id='TBEX_closeWindowButton' title='Close'>X</a></div></div><iframe frameborder='0' hspace='0' src='" + urlNoQuery[0] + "&in_smoothbox=true' id='TBEX_iframeContent' name='TBEX_iframeContent' scrolling='auto' style='width:" + (ajaxContentW + 29) + "px;height:" + (ajaxContentH + 17) + "px;' onload='TBEX_showWindow()'> </iframe>";
  }
  else {
    $("TBEX_window").innerHTML += "<div id='TBEX_title'><div id='TBEX_ajaxWindowTitle'>" + caption + "</div><div id='TBEX_closeAjaxWindow'><a href='#' id='TBEX_closeWindowButton'>X</a></div></div><div id='TBEX_ajaxContent' style='width:" + ajaxContentW + "px;height:" + ajaxContentH + "px;'></div>";
  }

  $("TBEX_closeWindowButton").onclick = TBEX_remove;

  if (url.indexOf('TBEX_inline') != -1) {
    $("TBEX_ajaxContent").innerHTML = ($(params['inlineId']).innerHTML);
    TBEX_position();
	$('TBEX_load').dispose();
    TBEX_showWindow();
  } else if (url.indexOf('TBEX_iframe') != -1) {
    TBEX_position();
    if (frames['TBEX_iframeContent'] == undefined) {//be nice to safari
      $(document).keyup(function(e){
                    var key = e.keyCode;
                    if (key == 27) {
                        TBEX_remove()
                    }
      });
      TBEX_showWindow();
    }
  } else {
	

    var handlerFunc = function(){
          TBEX_position();
		  $("TBEX_load").dispose();
          TBEX_showWindow();
    };
    new Request.HTML({
                    method: 'get',
                    update: $("TBEX_ajaxContent"),
                    onComplete: handlerFunc
    }).get(url);
  }

  document.onkeyup = function(event){
      var event = new Event(event);
      if (event.code == 27) { // close
          TBEX_remove();
      }
  }


}

//helper functions below

function TBEX_showWindow(){

    if($('TBEX_load')) {
    	$('TBEX_load').dispose();
    }

    if (TBEX_doneOnce == 0) {
        TBEX_doneOnce = 1;
        
        $('TBEX_window').set('tween', {
            duration: 250
        });
        $('TBEX_window').tween('opacity', 0, 1);
        
    }
    else {
        $('TBEX_window').setStyle('opacity', 1);
    }

//  $('TBEX_window').setStyle('opacity', 1);
}

function TBEX_remove(){
    $("TBEX_overlay").onclick = null;
    document.onkeyup = null;
    document.onkeydown = null;
    
    if ($('TBEX_closeWindowButton')) 
        $("TBEX_closeWindowButton").onclick = null;
    
    $('TBEX_window').set('tween', {
        duration: 250,
        onComplete: function(){
            $('TBEX_window').dispose();
			// SEMODS also kill TB
			if($('TB_window')) {
				$('TB_window').dispose();
			}
        }
    });
    $('TBEX_window').tween('opacity', 1, 0);
    
    
    
    $('TBEX_overlay').set('tween', {
        duration: 400,
        onComplete: function(){
            $('TBEX_overlay').dispose();
			// SEMODS also kill TB
			if($('TB_overlay')) {
				$('TB_overlay').dispose();
			}
        }
    });
    $('TBEX_overlay').tween('opacity', 0.6, 0);
    
    window.onscroll = null;
    window.onresize = null;
    
    TBEX_init();
    TBEX_doneOnce = 0;
    return false;
}

function TBEX_position() {
//    $('TB_window').set('morph', {
//        duration: 75
//    });
//    $('TB_window').morph({
//		width: TB_WIDTH + 'px',
//		left: (window.getScrollLeft() + (window.getWidth() - TB_WIDTH) / 2) + 'px',
//		top: (window.getScrollTop() + (window.getHeight() - TB_HEIGHT) / 2) + 'px'
//	});	

	$('TBEX_window').setStyle('marginLeft', '-' + parseInt(TBEX_WIDTH / 2) + 'px');
	$('TBEX_window').setStyle('width', TBEX_WIDTH + 'px');

     //$("#TBEX_window").css({marginLeft: '-' + parseInt(TBEX_WIDTH / 2) + 'px', width: TBEX_WIDTH + 'px'});
     //if ( !(jQuery.browser.msie && typeof XMLHttpRequest == 'function') ) { // take away IE6
     //    $("#TBEX_window").css({marginTop: '-' + parseInt(TBEX_HEIGHT / 2) + 'px'});
     //}
     if ( !(SEMods.B.isIE && typeof XMLHttpRequest == 'function') ) { // take away IE6
		$('TBEX_window').setStyle('marginTop', '-' + parseInt(TBEX_HEIGHT / 2) + 'px');
         //$("#TBEX_window").css({marginTop: '-' + parseInt(TBEX_HEIGHT / 2) + 'px'});
     }

}


function TBEX_parseQuery(query){
    // return empty object
    if (!query) 
        return {};
    var params = {};
    
    // parse query
    var pairs = query.split(/[;&]/);
    for (var i = 0; i < pairs.length; i++) {
        var pair = pairs[i].split('=');
        if (!pair || pair.length != 2) 
            continue;
        // unescape both key and value, replace "+" with spaces in value
        params[unescape(pair[0])] = unescape(pair[1]).replace(/\+/g, ' ');
    }
    return params;
}
/* moofacebox.js start *//*
 * mooFacebox
 * version: 0.1 (03/10/2008)
 * @requires MooTools v1.2 or later
 *
 * MODIFIED BY SocialEngineMods http://www.socialenginemods.net/
 *
 * Facebox is a port to mootools of the original 
 * Facebox (http://famspam.com/facebox) written by Chris Wanstrath with some 
 * added features like drag support and titles.
 *
 * Licensed under the MIT:
 *
 *   http://www.opensource.org/licenses/mit-license.php
 *
 * Copyright 2007, 2008 Chris Wanstrath [ chris@ozmm.org ]
 * Copyright 2008 Augusto Becciu [ augusto@becciu.org ]
 *
 * Usage:
 *  
 *  window.addEvent('domready', function() {
 *      var myFacebox = new mooFacebox();
 *  });
 *
 *
 *  <a href="#terms" rel="facebox">Terms</a>
 *    Loads the #terms div in the box
 *
 *  <a href="terms.html" rel="facebox">Terms</a>
 *    Loads the terms.html page in the box
 *
 *  <a href="terms.png" rel="facebox">Terms</a>
 *    Loads the terms.png image in the box
 *
 */


// TODO: on ajax error (404) - ok
var _mooFaceboxEx = null;

function mooFaceboxExShow(caption, url, width, showclosebutton) {
    if(!_mooFaceboxEx) {
        _mooFaceboxEx = new mooFaceboxEx();
    }
    _mooFaceboxEx.show(caption, url, width, showclosebutton);
}

function mooFaceboxExClose() {
    if(!_mooFaceboxEx)
        return;

    _mooFaceboxEx.close();
}


var mooFaceboxEx = new Class({

    Implements: Options,

    options: {
        draggable: true,
        showclosebutton : true,
        width: '370',
        elementsSelector: 'a[rel="facebox"]',
        loading_image : './include/js/moofacebox/images/loading.gif',
        close_image   : './include/js/moofacebox/images/closelabel.gif',
        image_types   : [ 'png', 'jpg', 'jpeg', 'gif' ],
        facebox_html  : '\
    <div class="facebox-popup"> \
      <table class="facebox-table"> \
        <tbody> \
          <tr> \
            <td class="facebox-tl"/><td class="facebox-b"/><td class="facebox-tr"/> \
          </tr> \
          <tr> \
            <td class="facebox-b"/> \
            <td class="facebox-dialog-content"> \
              <div class="facebox-body"> \
                <div class="facebox-content"> \
                </div> \
                <div class="facebox-footer"> \
                  <a href="#" class="facebox-close"> \
                    <img src="./include/js/moofacebox/images/closelabel.gif" title="close" class="facebox-close_image" onerror="this.src=\'../include/js/moofacebox/images/closelabel.gif\'"/> \
                  </a> \
                </div> \
              </div> \
            </td> \
            <td class="facebox-b"/> \
          </tr> \
          <tr> \
            <td class="facebox-bl"/><td class="facebox-b"/><td class="facebox-br"/> \
          </tr> \
        </tbody> \
      </table> \
    </div>'
    },

    loading: function() {
        if (this.faceboxEl.getElement('.facebox-loading')) return true;

        this.faceboxEl.getElement('.facebox-content').empty();

        var bodyEl = this.faceboxEl.getElement('.facebox-body');
        bodyEl.getChildren().setStyle('display', 'none');
        
        var loadingEl = new Element('div', {'class': 'facebox-loading'});
        var loadingImgEl = new Element('img', {'src': this.options.loading_image});
        loadingEl.adopt(loadingImgEl);

        bodyEl.adopt(loadingEl);

        var pageScroll = this.getPageScroll();
        this.faceboxEl.setStyles({
            top: pageScroll[1] + (this.getPageHeight() / 4),
            left: pageScroll[0]
        });

        $(document).addEvent('keydown', this.keydownHdlr);

        this.fadeIn(this.faceboxEl);
    },

    reveal: function(data, klass) {
        if (klass) this.faceboxEl.getElement('.facebox-content').addClass(klass);

        //this.faceboxEl.setStyle('display', 'none');
        //if ($type(data) == 'string') {
        //    this.faceboxEl.getElement('.facebox-content-measure').set('html', data);
        //}
        //else {
        //    this.faceboxEl.getElement('.facebox-content-measure').adopt(data);
        //}

        //var width = parseInt( this.faceboxEl.getElement('.facebox-content-measure').getStyle('clientWidth') );
        //var width = this.faceboxEl.getElement('.facebox-content-measure').offsetWidth;
        //var xx = document.getElementById("asdasdasd");
        //var width = xx.offsetWidth;
        //console.debug("width:" + width);
        //if(width < 370) {
            //this.faceboxEl.getElement('.facebox-content').setStyle('width','370px');
        //}


        if ($type(data) == 'string') {
            this.faceboxEl.getElement('.facebox-content').set('html', data);
        }
        else {
            this.faceboxEl.getElement('.facebox-content').adopt(data);
        }

        this.faceboxEl.getElement('.facebox-loading').destroy();

        //var width = parseInt( this.faceboxEl.getElement('.facebox-content').getStyle('width') );
        //console.debug("width:" + width);
        //if(width < 370) {
        //    this.faceboxEl.getElement('.facebox-content').setStyle('width','370px');
        //}
        //this.faceboxEl.style.width = "370px";
        //width = parseInt( this.faceboxEl.getElement('.facebox-content').getStyle('width') );
        //console.debug("width:" + width);
        //console.debug("width:" + this.faceboxEl.getElement('.facebox-content-measure').offsetWidth);

        //this.faceboxEl.setStyle('display', 'block');

        this.faceboxEl.getElement('.facebox-body').getChildren().each(this.fadeIn);

//        this.faceboxEl.setStyles({
//            top: pageScroll[1] + (this.getPageHeight() / 4),
//            left: pageScroll[0]
//        });

//        $('#facebox').css('left', $(window).width() / 2 - ($('#facebox table').width() / 2))

    },

    fadeIn: function(el) {
        el.set('tween', {
            onStart: function() {
                el.setStyle('display', 'block');
            }
        });
        el.fade('in');
    },

    fadeOut: function(el) {
        el.set('tween', {
            onComplete: function() {
                el.setStyle('display', 'none');
            }
        });
        el.fade('out');
    },

    close: function() {
        $(document).removeEvent('keydown', this.keydownHdlr);

        this.fadeOut(this.faceboxEl);
        var contentEl = this.faceboxEl.getElement('.facebox-content');
        contentEl.set('class', '');
        contentEl.addClass('facebox-content');
        return false;
    },

    //setTitle: function(title) {
    //    var titleEl = this.faceboxEl.getElement('.facebox-title');
    //    title = "adasdasdasdasdasdasdasd";
    //    if (title == "")
    //        titleEl.setStyle('display', 'none');
    //    else
    //        titleEl.setStyle('display', 'block');
    //
    //    //titleEl.getElement('span').setText(title);
    //},

    initialize: function(options) {
        this.setOptions(options);

        this.faceboxEl = new Element('div', {'id': 'facebox', 'style': 'display: none;'});
        this.faceboxEl.fade('hide');
        this.faceboxEl.set('html', this.options.facebox_html);

        $(document.body).adopt(this.faceboxEl);

        // preload images
        var preload = [ new Asset.image(this.options.close_image),
                        new Asset.image(this.options.loading_image) ];

        this.faceboxEl.getElements('.facebox-b:first, .facebox-bl, .facebox-br, .facebox-tl, .facebox-tr').each(function(el) {
            preload.push(new Asset.image(el.getStyle('background-image').replace(/url\((.+)\)/, '$1')));
        });

        this.faceboxEl.getElement('.facebox-close').addEvent('click', this.close.bind(this));
        this.faceboxEl.getElement('.facebox-close_image').set('src', this.options.close_image);

        if (this.options.draggable == true) {
            var dcontentEl = this.faceboxEl.getElement('.facebox-dialog-content');
            this.drag = this.faceboxEl.makeDraggable({handle: dcontentEl});
            dcontentEl.setStyle('cursor', 'move');
        }

        this.keydownHdlr = function(e) {
            e = new Event(e);
            e.stop();

            if (e.code == 27) this.close();
        }.bind(this);

        var image_types = this.options.image_types.join('|');
        image_types = new RegExp('\.' + image_types + '$', 'i');
        this.image_types = image_types;

        var elements = $$(this.options.elementsSelector);

        elements.addEvent('click', function(e) {
            e = new Event(e);
            e.stop();

            //this.setTitle(e.target.title);

            this.loading();

            // support for rel="facebox[.inline_popup]" syntax, to add a class
            var klass = e.target.rel.match(/facebox\[\.(\w+)\]/);
            if (klass) klass = klass[1];

            // div
            if (e.target.href.match(/#/)) {
                var url = window.location.href.split('#')[0];
                var target = e.target.href.replace(url+'#','');
                this.reveal($(target).clone().setStyle('display','block'), klass);

            // image
            } else if (e.target.href.match(image_types)) {
                var image = new Asset.image(e.target.href, {
                    onload: function() {
                        this.reveal('<div class="facebox-image"><img src="' + image.src + '" /></div>', klass);
                    }.bind(this)
                });

            // ajax
            } else {
                new Request({
                    url: e.target.href,
                    method: 'get',
                    onSuccess: function(responseText, responseXML) {
                        this.reveal(responseText, klass);
                    }.bind(this),
                    onFailure: function(responseText, responseXML) {
                        this.reveal("Error loading content.", klass);
                    }.bind(this)
                }).send();
            }

            return false;
        }.bind(this));

    },
    
    show : function(caption, targeturl, width, showclosebutton) {

        var klass = "";
        //this.width = "370px";
        //if(options) {
            //this.setOptions(options);
        //}

        if(width) {
            this.options.width = width;
        }

        if(showclosebutton) {
            this.options.showclosebutton = showclosebutton;
        }
        
        this.faceboxEl.getElement('.facebox-content').setStyle('width',this.options.width + 'px');

        //if(options) {
        //    if(options.width) {
        //        this.options.width = options.width + 'px';
        //    }
        //}

        this.loading();

        // div
        if (targeturl.match(/^#/)) {
            //var url = window.location.href.split('#')[0];
            //var target = targeturl.replace(url+'#','');
            var target = targeturl.replace('#','');
            this.reveal($(target).clone().setStyle('display','block'), klass);

        // image
        } else if (targeturl.match(this.image_types)) {
            var image = new Asset.image(targeturl, {
                onload: function() {
                    this.reveal('<div class="facebox-image"><img src="' + image.src + '" /></div>', klass);
                }.bind(this)
            });

        // ajax
        } else {
            new Request({
                url: targeturl,
                method: 'get',
                onSuccess: function(responseText, responseXML) {
                    this.reveal(responseText, klass);
                }.bind(this),
                onFailure: function(responseText, responseXML) {
                    this.reveal("Error loading content", klass);
                }.bind(this)
            }).send();
        }

        return false;
    },

    // getPageScroll() by quirksmode.com
    getPageScroll: function() {
        var xScroll, yScroll;
        if (self.pageYOffset) {
            yScroll = self.pageYOffset;
            xScroll = self.pageXOffset;
        } else if (document.documentElement && document.documentElement.scrollTop) { // Explorer 6 Strict
            yScroll = document.documentElement.scrollTop;
            xScroll = document.documentElement.scrollLeft;
        } else if (document.body) {// all other Explorers
            yScroll = document.body.scrollTop;
            xScroll = document.body.scrollLeft;	
        }

        return new Array(xScroll,yScroll);
    },

    // adapter from getPageSize() by quirksmode.com
    getPageHeight: function() {
        var windowHeight;
        if (self.innerHeight) {	// all except Explorer
            windowHeight = self.innerHeight;
        } else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
            windowHeight = document.documentElement.clientHeight;
        } else if (document.body) { // other Explorers
            windowHeight = document.body.clientHeight;
        }

        return windowHeight;
    }

});

