

/**
 * SWFObject v1.5: Flash Player detection and embed - http://blog.deconcept.com/swfobject/
 *
 * SWFObject is (c) 2007 Geoff Stearns and is released under the MIT License:
 * http://www.opensource.org/licenses/mit-license.php
 *
 */
if(typeof deconcept=="undefined"){var deconcept=new Object();}if(typeof deconcept.util=="undefined"){deconcept.util=new Object();}if(typeof deconcept.SWFObjectUtil=="undefined"){deconcept.SWFObjectUtil=new Object();}deconcept.SWFObject=function(_1,id,w,h,_5,c,_7,_8,_9,_a){if(!document.getElementById){return;}this.DETECT_KEY=_a?_a:"detectflash";this.skipDetect=deconcept.util.getRequestParameter(this.DETECT_KEY);this.params=new Object();this.variables=new Object();this.attributes=new Array();if(_1){this.setAttribute("swf",_1);}if(id){this.setAttribute("id",id);}if(w){this.setAttribute("width",w);}if(h){this.setAttribute("height",h);}if(_5){this.setAttribute("version",new deconcept.PlayerVersion(_5.toString().split(".")));}this.installedVer=deconcept.SWFObjectUtil.getPlayerVersion();if(!window.opera&&document.all&&this.installedVer.major>7){deconcept.SWFObject.doPrepUnload=true;}if(c){this.addParam("bgcolor",c);}var q=_7?_7:"high";this.addParam("quality",q);this.setAttribute("useExpressInstall",false);this.setAttribute("doExpressInstall",false);var _c=(_8)?_8:window.location;this.setAttribute("xiRedirectUrl",_c);this.setAttribute("redirectUrl","");if(_9){this.setAttribute("redirectUrl",_9);}};deconcept.SWFObject.prototype={useExpressInstall:function(_d){this.xiSWFPath=!_d?"expressinstall.swf":_d;this.setAttribute("useExpressInstall",true);},setAttribute:function(_e,_f){this.attributes[_e]=_f;},getAttribute:function(_10){return this.attributes[_10];},addParam:function(_11,_12){this.params[_11]=_12;},getParams:function(){return this.params;},addVariable:function(_13,_14){this.variables[_13]=_14;},getVariable:function(_15){return this.variables[_15];},getVariables:function(){return this.variables;},getVariablePairs:function(){var _16=new Array();var key;var _18=this.getVariables();for(key in _18){_16[_16.length]=key+"="+_18[key];}return _16;},getSWFHTML:function(){var _19="";if(navigator.plugins&&navigator.mimeTypes&&navigator.mimeTypes.length){if(this.getAttribute("doExpressInstall")){this.addVariable("MMplayerType","PlugIn");this.setAttribute("swf",this.xiSWFPath);}_19="<embed type=\"application/x-shockwave-flash\" src=\""+this.getAttribute("swf")+"\" width=\""+this.getAttribute("width")+"\" height=\""+this.getAttribute("height")+"\" style=\""+this.getAttribute("style")+"\"";_19+=" id=\""+this.getAttribute("id")+"\" name=\""+this.getAttribute("id")+"\" ";var _1a=this.getParams();for(var key in _1a){_19+=[key]+"=\""+_1a[key]+"\" ";}var _1c=this.getVariablePairs().join("&");if(_1c.length>0){_19+="flashvars=\""+_1c+"\"";}_19+="/>";}else{if(this.getAttribute("doExpressInstall")){this.addVariable("MMplayerType","ActiveX");this.setAttribute("swf",this.xiSWFPath);}_19="<object id=\""+this.getAttribute("id")+"\" classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\" width=\""+this.getAttribute("width")+"\" height=\""+this.getAttribute("height")+"\" style=\""+this.getAttribute("style")+"\">";_19+="<param name=\"movie\" value=\""+this.getAttribute("swf")+"\" />";var _1d=this.getParams();for(var key in _1d){_19+="<param name=\""+key+"\" value=\""+_1d[key]+"\" />";}var _1f=this.getVariablePairs().join("&");if(_1f.length>0){_19+="<param name=\"flashvars\" value=\""+_1f+"\" />";}_19+="</object>";}return _19;},write:function(_20){if(this.getAttribute("useExpressInstall")){var _21=new deconcept.PlayerVersion([6,0,65]);if(this.installedVer.versionIsValid(_21)&&!this.installedVer.versionIsValid(this.getAttribute("version"))){this.setAttribute("doExpressInstall",true);this.addVariable("MMredirectURL",escape(this.getAttribute("xiRedirectUrl")));document.title=document.title.slice(0,47)+" - Flash Player Installation";this.addVariable("MMdoctitle",document.title);}}if(this.skipDetect||this.getAttribute("doExpressInstall")||this.installedVer.versionIsValid(this.getAttribute("version"))){var n=(typeof _20=="string")?document.getElementById(_20):_20;n.innerHTML=this.getSWFHTML();return true;}else{if(this.getAttribute("redirectUrl")!=""){document.location.replace(this.getAttribute("redirectUrl"));}}return false;}};deconcept.SWFObjectUtil.getPlayerVersion=function(){var _23=new deconcept.PlayerVersion([0,0,0]);if(navigator.plugins&&navigator.mimeTypes.length){var x=navigator.plugins["Shockwave Flash"];if(x&&x.description){_23=new deconcept.PlayerVersion(x.description.replace(/([a-zA-Z]|\s)+/,"").replace(/(\s+r|\s+b[0-9]+)/,".").split("."));}}else{if(navigator.userAgent&&navigator.userAgent.indexOf("Windows CE")>=0){var axo=1;var _26=3;while(axo){try{_26++;axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash."+_26);_23=new deconcept.PlayerVersion([_26,0,0]);}catch(e){axo=null;}}}else{try{var axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");}catch(e){try{var axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");_23=new deconcept.PlayerVersion([6,0,21]);axo.AllowScriptAccess="always";}catch(e){if(_23.major==6){return _23;}}try{axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash");}catch(e){}}if(axo!=null){_23=new deconcept.PlayerVersion(axo.GetVariable("$version").split(" ")[1].split(","));}}}return _23;};deconcept.PlayerVersion=function(_29){this.major=_29[0]!=null?parseInt(_29[0]):0;this.minor=_29[1]!=null?parseInt(_29[1]):0;this.rev=_29[2]!=null?parseInt(_29[2]):0;};deconcept.PlayerVersion.prototype.versionIsValid=function(fv){if(this.major<fv.major){return false;}if(this.major>fv.major){return true;}if(this.minor<fv.minor){return false;}if(this.minor>fv.minor){return true;}if(this.rev<fv.rev){return false;}return true;};deconcept.util={getRequestParameter:function(_2b){var q=document.location.search||document.location.hash;if(_2b==null){return q;}if(q){var _2d=q.substring(1).split("&");for(var i=0;i<_2d.length;i++){if(_2d[i].substring(0,_2d[i].indexOf("="))==_2b){return _2d[i].substring((_2d[i].indexOf("=")+1));}}}return "";}};deconcept.SWFObjectUtil.cleanupSWFs=function(){var _2f=document.getElementsByTagName("OBJECT");for(var i=_2f.length-1;i>=0;i--){_2f[i].style.display="none";for(var x in _2f[i]){if(typeof _2f[i][x]=="function"){_2f[i][x]=function(){};}}}};if(deconcept.SWFObject.doPrepUnload){if(!deconcept.unloadSet){deconcept.SWFObjectUtil.prepUnload=function(){__flash_unloadHandler=function(){};__flash_savedUnloadHandler=function(){};window.attachEvent("onunload",deconcept.SWFObjectUtil.cleanupSWFs);};window.attachEvent("onbeforeunload",deconcept.SWFObjectUtil.prepUnload);deconcept.unloadSet=true;}}if(!document.getElementById&&document.all){document.getElementById=function(id){return document.all[id];};}var getQueryParamValue=deconcept.util.getRequestParameter;var FlashObject=deconcept.SWFObject;var SWFObject=deconcept.SWFObject;/*
 * jQuery JavaScript Library v1.3.2
 * http://jquery.com/
 *
 * Copyright (c) 2009 John Resig
 * Dual licensed under the MIT and GPL licenses.
 * http://docs.jquery.com/License
 *
 * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009)
 * Revision: 6246
 */
(function(){var l=this,g,y=l.jQuery,p=l.$,o=l.jQuery=l.$=function(E,F){return new o.fn.init(E,F)},D=/^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,f=/^.[^:#\[\.,]*$/;o.fn=o.prototype={init:function(E,H){E=E||document;if(E.nodeType){this[0]=E;this.length=1;this.context=E;return this}if(typeof E==="string"){var G=D.exec(E);if(G&&(G[1]||!H)){if(G[1]){E=o.clean([G[1]],H)}else{var I=document.getElementById(G[3]);if(I&&I.id!=G[3]){return o().find(E)}var F=o(I||[]);F.context=document;F.selector=E;return F}}else{return o(H).find(E)}}else{if(o.isFunction(E)){return o(document).ready(E)}}if(E.selector&&E.context){this.selector=E.selector;this.context=E.context}return this.setArray(o.isArray(E)?E:o.makeArray(E))},selector:"",jquery:"1.3.2",size:function(){return this.length},get:function(E){return E===g?Array.prototype.slice.call(this):this[E]},pushStack:function(F,H,E){var G=o(F);G.prevObject=this;G.context=this.context;if(H==="find"){G.selector=this.selector+(this.selector?" ":"")+E}else{if(H){G.selector=this.selector+"."+H+"("+E+")"}}return G},setArray:function(E){this.length=0;Array.prototype.push.apply(this,E);return this},each:function(F,E){return o.each(this,F,E)},index:function(E){return o.inArray(E&&E.jquery?E[0]:E,this)},attr:function(F,H,G){var E=F;if(typeof F==="string"){if(H===g){return this[0]&&o[G||"attr"](this[0],F)}else{E={};E[F]=H}}return this.each(function(I){for(F in E){o.attr(G?this.style:this,F,o.prop(this,E[F],G,I,F))}})},css:function(E,F){if((E=="width"||E=="height")&&parseFloat(F)<0){F=g}return this.attr(E,F,"curCSS")},text:function(F){if(typeof F!=="object"&&F!=null){return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(F))}var E="";o.each(F||this,function(){o.each(this.childNodes,function(){if(this.nodeType!=8){E+=this.nodeType!=1?this.nodeValue:o.fn.text([this])}})});return E},wrapAll:function(E){if(this[0]){var F=o(E,this[0].ownerDocument).clone();if(this[0].parentNode){F.insertBefore(this[0])}F.map(function(){var G=this;while(G.firstChild){G=G.firstChild}return G}).append(this)}return this},wrapInner:function(E){return this.each(function(){o(this).contents().wrapAll(E)})},wrap:function(E){return this.each(function(){o(this).wrapAll(E)})},append:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.appendChild(E)}})},prepend:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.insertBefore(E,this.firstChild)}})},before:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this)})},after:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this.nextSibling)})},end:function(){return this.prevObject||o([])},push:[].push,sort:[].sort,splice:[].splice,find:function(E){if(this.length===1){var F=this.pushStack([],"find",E);F.length=0;o.find(E,this[0],F);return F}else{return this.pushStack(o.unique(o.map(this,function(G){return o.find(E,G)})),"find",E)}},clone:function(G){var E=this.map(function(){if(!o.support.noCloneEvent&&!o.isXMLDoc(this)){var I=this.outerHTML;if(!I){var J=this.ownerDocument.createElement("div");J.appendChild(this.cloneNode(true));I=J.innerHTML}return o.clean([I.replace(/ jQuery\d+="(?:\d+|null)"/g,"").replace(/^\s*/,"")])[0]}else{return this.cloneNode(true)}});if(G===true){var H=this.find("*").andSelf(),F=0;E.find("*").andSelf().each(function(){if(this.nodeName!==H[F].nodeName){return}var I=o.data(H[F],"events");for(var K in I){for(var J in I[K]){o.event.add(this,K,I[K][J],I[K][J].data)}}F++})}return E},filter:function(E){return this.pushStack(o.isFunction(E)&&o.grep(this,function(G,F){return E.call(G,F)})||o.multiFilter(E,o.grep(this,function(F){return F.nodeType===1})),"filter",E)},closest:function(E){var G=o.expr.match.POS.test(E)?o(E):null,F=0;return this.map(function(){var H=this;while(H&&H.ownerDocument){if(G?G.index(H)>-1:o(H).is(E)){o.data(H,"closest",F);return H}H=H.parentNode;F++}})},not:function(E){if(typeof E==="string"){if(f.test(E)){return this.pushStack(o.multiFilter(E,this,true),"not",E)}else{E=o.multiFilter(E,this)}}var F=E.length&&E[E.length-1]!==g&&!E.nodeType;return this.filter(function(){return F?o.inArray(this,E)<0:this!=E})},add:function(E){return this.pushStack(o.unique(o.merge(this.get(),typeof E==="string"?o(E):o.makeArray(E))))},is:function(E){return !!E&&o.multiFilter(E,this).length>0},hasClass:function(E){return !!E&&this.is("."+E)},val:function(K){if(K===g){var E=this[0];if(E){if(o.nodeName(E,"option")){return(E.attributes.value||{}).specified?E.value:E.text}if(o.nodeName(E,"select")){var I=E.selectedIndex,L=[],M=E.options,H=E.type=="select-one";if(I<0){return null}for(var F=H?I:0,J=H?I+1:M.length;F<J;F++){var G=M[F];if(G.selected){K=o(G).val();if(H){return K}L.push(K)}}return L}return(E.value||"").replace(/\r/g,"")}return g}if(typeof K==="number"){K+=""}return this.each(function(){if(this.nodeType!=1){return}if(o.isArray(K)&&/radio|checkbox/.test(this.type)){this.checked=(o.inArray(this.value,K)>=0||o.inArray(this.name,K)>=0)}else{if(o.nodeName(this,"select")){var N=o.makeArray(K);o("option",this).each(function(){this.selected=(o.inArray(this.value,N)>=0||o.inArray(this.text,N)>=0)});if(!N.length){this.selectedIndex=-1}}else{this.value=K}}})},html:function(E){return E===g?(this[0]?this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g,""):null):this.empty().append(E)},replaceWith:function(E){return this.after(E).remove()},eq:function(E){return this.slice(E,+E+1)},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments),"slice",Array.prototype.slice.call(arguments).join(","))},map:function(E){return this.pushStack(o.map(this,function(G,F){return E.call(G,F,G)}))},andSelf:function(){return this.add(this.prevObject)},domManip:function(J,M,L){if(this[0]){var I=(this[0].ownerDocument||this[0]).createDocumentFragment(),F=o.clean(J,(this[0].ownerDocument||this[0]),I),H=I.firstChild;if(H){for(var G=0,E=this.length;G<E;G++){L.call(K(this[G],H),this.length>1||G>0?I.cloneNode(true):I)}}if(F){o.each(F,z)}}return this;function K(N,O){return M&&o.nodeName(N,"table")&&o.nodeName(O,"tr")?(N.getElementsByTagName("tbody")[0]||N.appendChild(N.ownerDocument.createElement("tbody"))):N}}};o.fn.init.prototype=o.fn;function z(E,F){if(F.src){o.ajax({url:F.src,async:false,dataType:"script"})}else{o.globalEval(F.text||F.textContent||F.innerHTML||"")}if(F.parentNode){F.parentNode.removeChild(F)}}function e(){return +new Date}o.extend=o.fn.extend=function(){var J=arguments[0]||{},H=1,I=arguments.length,E=false,G;if(typeof J==="boolean"){E=J;J=arguments[1]||{};H=2}if(typeof J!=="object"&&!o.isFunction(J)){J={}}if(I==H){J=this;--H}for(;H<I;H++){if((G=arguments[H])!=null){for(var F in G){var K=J[F],L=G[F];if(J===L){continue}if(E&&L&&typeof L==="object"&&!L.nodeType){J[F]=o.extend(E,K||(L.length!=null?[]:{}),L)}else{if(L!==g){J[F]=L}}}}}return J};var b=/z-?index|font-?weight|opacity|zoom|line-?height/i,q=document.defaultView||{},s=Object.prototype.toString;o.extend({noConflict:function(E){l.$=p;if(E){l.jQuery=y}return o},isFunction:function(E){return s.call(E)==="[object Function]"},isArray:function(E){return s.call(E)==="[object Array]"},isXMLDoc:function(E){return E.nodeType===9&&E.documentElement.nodeName!=="HTML"||!!E.ownerDocument&&o.isXMLDoc(E.ownerDocument)},globalEval:function(G){if(G&&/\S/.test(G)){var F=document.getElementsByTagName("head")[0]||document.documentElement,E=document.createElement("script");E.type="text/javascript";if(o.support.scriptEval){E.appendChild(document.createTextNode(G))}else{E.text=G}F.insertBefore(E,F.firstChild);F.removeChild(E)}},nodeName:function(F,E){return F.nodeName&&F.nodeName.toUpperCase()==E.toUpperCase()},each:function(G,K,F){var E,H=0,I=G.length;if(F){if(I===g){for(E in G){if(K.apply(G[E],F)===false){break}}}else{for(;H<I;){if(K.apply(G[H++],F)===false){break}}}}else{if(I===g){for(E in G){if(K.call(G[E],E,G[E])===false){break}}}else{for(var J=G[0];H<I&&K.call(J,H,J)!==false;J=G[++H]){}}}return G},prop:function(H,I,G,F,E){if(o.isFunction(I)){I=I.call(H,F)}return typeof I==="number"&&G=="curCSS"&&!b.test(E)?I+"px":I},className:{add:function(E,F){o.each((F||"").split(/\s+/),function(G,H){if(E.nodeType==1&&!o.className.has(E.className,H)){E.className+=(E.className?" ":"")+H}})},remove:function(E,F){if(E.nodeType==1){E.className=F!==g?o.grep(E.className.split(/\s+/),function(G){return !o.className.has(F,G)}).join(" "):""}},has:function(F,E){return F&&o.inArray(E,(F.className||F).toString().split(/\s+/))>-1}},swap:function(H,G,I){var E={};for(var F in G){E[F]=H.style[F];H.style[F]=G[F]}I.call(H);for(var F in G){H.style[F]=E[F]}},css:function(H,F,J,E){if(F=="width"||F=="height"){var L,G={position:"absolute",visibility:"hidden",display:"block"},K=F=="width"?["Left","Right"]:["Top","Bottom"];function I(){L=F=="width"?H.offsetWidth:H.offsetHeight;if(E==="border"){return}o.each(K,function(){if(!E){L-=parseFloat(o.curCSS(H,"padding"+this,true))||0}if(E==="margin"){L+=parseFloat(o.curCSS(H,"margin"+this,true))||0}else{L-=parseFloat(o.curCSS(H,"border"+this+"Width",true))||0}})}if(H.offsetWidth!==0){I()}else{o.swap(H,G,I)}return Math.max(0,Math.round(L))}return o.curCSS(H,F,J)},curCSS:function(I,F,G){var L,E=I.style;if(F=="opacity"&&!o.support.opacity){L=o.attr(E,"opacity");return L==""?"1":L}if(F.match(/float/i)){F=w}if(!G&&E&&E[F]){L=E[F]}else{if(q.getComputedStyle){if(F.match(/float/i)){F="float"}F=F.replace(/([A-Z])/g,"-$1").toLowerCase();var M=q.getComputedStyle(I,null);if(M){L=M.getPropertyValue(F)}if(F=="opacity"&&L==""){L="1"}}else{if(I.currentStyle){var J=F.replace(/\-(\w)/g,function(N,O){return O.toUpperCase()});L=I.currentStyle[F]||I.currentStyle[J];if(!/^\d+(px)?$/i.test(L)&&/^\d/.test(L)){var H=E.left,K=I.runtimeStyle.left;I.runtimeStyle.left=I.currentStyle.left;E.left=L||0;L=E.pixelLeft+"px";E.left=H;I.runtimeStyle.left=K}}}}return L},clean:function(F,K,I){K=K||document;if(typeof K.createElement==="undefined"){K=K.ownerDocument||K[0]&&K[0].ownerDocument||document}if(!I&&F.length===1&&typeof F[0]==="string"){var H=/^<(\w+)\s*\/?>$/.exec(F[0]);if(H){return[K.createElement(H[1])]}}var G=[],E=[],L=K.createElement("div");o.each(F,function(P,S){if(typeof S==="number"){S+=""}if(!S){return}if(typeof S==="string"){S=S.replace(/(<(\w+)[^>]*?)\/>/g,function(U,V,T){return T.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?U:V+"></"+T+">"});var O=S.replace(/^\s+/,"").substring(0,10).toLowerCase();var Q=!O.indexOf("<opt")&&[1,"<select multiple='multiple'>","</select>"]||!O.indexOf("<leg")&&[1,"<fieldset>","</fieldset>"]||O.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"<table>","</table>"]||!O.indexOf("<tr")&&[2,"<table><tbody>","</tbody></table>"]||(!O.indexOf("<td")||!O.indexOf("<th"))&&[3,"<table><tbody><tr>","</tr></tbody></table>"]||!O.indexOf("<col")&&[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"]||!o.support.htmlSerialize&&[1,"div<div>","</div>"]||[0,"",""];L.innerHTML=Q[1]+S+Q[2];while(Q[0]--){L=L.lastChild}if(!o.support.tbody){var R=/<tbody/i.test(S),N=!O.indexOf("<table")&&!R?L.firstChild&&L.firstChild.childNodes:Q[1]=="<table>"&&!R?L.childNodes:[];for(var M=N.length-1;M>=0;--M){if(o.nodeName(N[M],"tbody")&&!N[M].childNodes.length){N[M].parentNode.removeChild(N[M])}}}if(!o.support.leadingWhitespace&&/^\s/.test(S)){L.insertBefore(K.createTextNode(S.match(/^\s*/)[0]),L.firstChild)}S=o.makeArray(L.childNodes)}if(S.nodeType){G.push(S)}else{G=o.merge(G,S)}});if(I){for(var J=0;G[J];J++){if(o.nodeName(G[J],"script")&&(!G[J].type||G[J].type.toLowerCase()==="text/javascript")){E.push(G[J].parentNode?G[J].parentNode.removeChild(G[J]):G[J])}else{if(G[J].nodeType===1){G.splice.apply(G,[J+1,0].concat(o.makeArray(G[J].getElementsByTagName("script"))))}I.appendChild(G[J])}}return E}return G},attr:function(J,G,K){if(!J||J.nodeType==3||J.nodeType==8){return g}var H=!o.isXMLDoc(J),L=K!==g;G=H&&o.props[G]||G;if(J.tagName){var F=/href|src|style/.test(G);if(G=="selected"&&J.parentNode){J.parentNode.selectedIndex}if(G in J&&H&&!F){if(L){if(G=="type"&&o.nodeName(J,"input")&&J.parentNode){throw"type property can't be changed"}J[G]=K}if(o.nodeName(J,"form")&&J.getAttributeNode(G)){return J.getAttributeNode(G).nodeValue}if(G=="tabIndex"){var I=J.getAttributeNode("tabIndex");return I&&I.specified?I.value:J.nodeName.match(/(button|input|object|select|textarea)/i)?0:J.nodeName.match(/^(a|area)$/i)&&J.href?0:g}return J[G]}if(!o.support.style&&H&&G=="style"){return o.attr(J.style,"cssText",K)}if(L){J.setAttribute(G,""+K)}var E=!o.support.hrefNormalized&&H&&F?J.getAttribute(G,2):J.getAttribute(G);return E===null?g:E}if(!o.support.opacity&&G=="opacity"){if(L){J.zoom=1;J.filter=(J.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(K)+""=="NaN"?"":"alpha(opacity="+K*100+")")}return J.filter&&J.filter.indexOf("opacity=")>=0?(parseFloat(J.filter.match(/opacity=([^)]*)/)[1])/100)+"":""}G=G.replace(/-([a-z])/ig,function(M,N){return N.toUpperCase()});if(L){J[G]=K}return J[G]},trim:function(E){return(E||"").replace(/^\s+|\s+$/g,"")},makeArray:function(G){var E=[];if(G!=null){var F=G.length;if(F==null||typeof G==="string"||o.isFunction(G)||G.setInterval){E[0]=G}else{while(F){E[--F]=G[F]}}}return E},inArray:function(G,H){for(var E=0,F=H.length;E<F;E++){if(H[E]===G){return E}}return -1},merge:function(H,E){var F=0,G,I=H.length;if(!o.support.getAll){while((G=E[F++])!=null){if(G.nodeType!=8){H[I++]=G}}}else{while((G=E[F++])!=null){H[I++]=G}}return H},unique:function(K){var F=[],E={};try{for(var G=0,H=K.length;G<H;G++){var J=o.data(K[G]);if(!E[J]){E[J]=true;F.push(K[G])}}}catch(I){F=K}return F},grep:function(F,J,E){var G=[];for(var H=0,I=F.length;H<I;H++){if(!E!=!J(F[H],H)){G.push(F[H])}}return G},map:function(E,J){var F=[];for(var G=0,H=E.length;G<H;G++){var I=J(E[G],G);if(I!=null){F[F.length]=I}}return F.concat.apply([],F)}});var C=navigator.userAgent.toLowerCase();o.browser={version:(C.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[0,"0"])[1],safari:/webkit/.test(C),opera:/opera/.test(C),msie:/msie/.test(C)&&!/opera/.test(C),mozilla:/mozilla/.test(C)&&!/(compatible|webkit)/.test(C)};o.each({parent:function(E){return E.parentNode},parents:function(E){return o.dir(E,"parentNode")},next:function(E){return o.nth(E,2,"nextSibling")},prev:function(E){return o.nth(E,2,"previousSibling")},nextAll:function(E){return o.dir(E,"nextSibling")},prevAll:function(E){return o.dir(E,"previousSibling")},siblings:function(E){return o.sibling(E.parentNode.firstChild,E)},children:function(E){return o.sibling(E.firstChild)},contents:function(E){return o.nodeName(E,"iframe")?E.contentDocument||E.contentWindow.document:o.makeArray(E.childNodes)}},function(E,F){o.fn[E]=function(G){var H=o.map(this,F);if(G&&typeof G=="string"){H=o.multiFilter(G,H)}return this.pushStack(o.unique(H),E,G)}});o.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(E,F){o.fn[E]=function(G){var J=[],L=o(G);for(var K=0,H=L.length;K<H;K++){var I=(K>0?this.clone(true):this).get();o.fn[F].apply(o(L[K]),I);J=J.concat(I)}return this.pushStack(J,E,G)}});o.each({removeAttr:function(E){o.attr(this,E,"");if(this.nodeType==1){this.removeAttribute(E)}},addClass:function(E){o.className.add(this,E)},removeClass:function(E){o.className.remove(this,E)},toggleClass:function(F,E){if(typeof E!=="boolean"){E=!o.className.has(this,F)}o.className[E?"add":"remove"](this,F)},remove:function(E){if(!E||o.filter(E,[this]).length){o("*",this).add([this]).each(function(){o.event.remove(this);o.removeData(this)});if(this.parentNode){this.parentNode.removeChild(this)}}},empty:function(){o(this).children().remove();while(this.firstChild){this.removeChild(this.firstChild)}}},function(E,F){o.fn[E]=function(){return this.each(F,arguments)}});function j(E,F){return E[0]&&parseInt(o.curCSS(E[0],F,true),10)||0}var h="jQuery"+e(),v=0,A={};o.extend({cache:{},data:function(F,E,G){F=F==l?A:F;var H=F[h];if(!H){H=F[h]=++v}if(E&&!o.cache[H]){o.cache[H]={}}if(G!==g){o.cache[H][E]=G}return E?o.cache[H][E]:H},removeData:function(F,E){F=F==l?A:F;var H=F[h];if(E){if(o.cache[H]){delete o.cache[H][E];E="";for(E in o.cache[H]){break}if(!E){o.removeData(F)}}}else{try{delete F[h]}catch(G){if(F.removeAttribute){F.removeAttribute(h)}}delete o.cache[H]}},queue:function(F,E,H){if(F){E=(E||"fx")+"queue";var G=o.data(F,E);if(!G||o.isArray(H)){G=o.data(F,E,o.makeArray(H))}else{if(H){G.push(H)}}}return G},dequeue:function(H,G){var E=o.queue(H,G),F=E.shift();if(!G||G==="fx"){F=E[0]}if(F!==g){F.call(H)}}});o.fn.extend({data:function(E,G){var H=E.split(".");H[1]=H[1]?"."+H[1]:"";if(G===g){var F=this.triggerHandler("getData"+H[1]+"!",[H[0]]);if(F===g&&this.length){F=o.data(this[0],E)}return F===g&&H[1]?this.data(H[0]):F}else{return this.trigger("setData"+H[1]+"!",[H[0],G]).each(function(){o.data(this,E,G)})}},removeData:function(E){return this.each(function(){o.removeData(this,E)})},queue:function(E,F){if(typeof E!=="string"){F=E;E="fx"}if(F===g){return o.queue(this[0],E)}return this.each(function(){var G=o.queue(this,E,F);if(E=="fx"&&G.length==1){G[0].call(this)}})},dequeue:function(E){return this.each(function(){o.dequeue(this,E)})}});
/*
 * Sizzle CSS Selector Engine - v0.9.3
 *  Copyright 2009, The Dojo Foundation
 *  Released under the MIT, BSD, and GPL Licenses.
 *  More information: http://sizzlejs.com/
 */
(function(){var R=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,L=0,H=Object.prototype.toString;var F=function(Y,U,ab,ac){ab=ab||[];U=U||document;if(U.nodeType!==1&&U.nodeType!==9){return[]}if(!Y||typeof Y!=="string"){return ab}var Z=[],W,af,ai,T,ad,V,X=true;R.lastIndex=0;while((W=R.exec(Y))!==null){Z.push(W[1]);if(W[2]){V=RegExp.rightContext;break}}if(Z.length>1&&M.exec(Y)){if(Z.length===2&&I.relative[Z[0]]){af=J(Z[0]+Z[1],U)}else{af=I.relative[Z[0]]?[U]:F(Z.shift(),U);while(Z.length){Y=Z.shift();if(I.relative[Y]){Y+=Z.shift()}af=J(Y,af)}}}else{var ae=ac?{expr:Z.pop(),set:E(ac)}:F.find(Z.pop(),Z.length===1&&U.parentNode?U.parentNode:U,Q(U));af=F.filter(ae.expr,ae.set);if(Z.length>0){ai=E(af)}else{X=false}while(Z.length){var ah=Z.pop(),ag=ah;if(!I.relative[ah]){ah=""}else{ag=Z.pop()}if(ag==null){ag=U}I.relative[ah](ai,ag,Q(U))}}if(!ai){ai=af}if(!ai){throw"Syntax error, unrecognized expression: "+(ah||Y)}if(H.call(ai)==="[object Array]"){if(!X){ab.push.apply(ab,ai)}else{if(U.nodeType===1){for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&(ai[aa]===true||ai[aa].nodeType===1&&K(U,ai[aa]))){ab.push(af[aa])}}}else{for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&ai[aa].nodeType===1){ab.push(af[aa])}}}}}else{E(ai,ab)}if(V){F(V,U,ab,ac);if(G){hasDuplicate=false;ab.sort(G);if(hasDuplicate){for(var aa=1;aa<ab.length;aa++){if(ab[aa]===ab[aa-1]){ab.splice(aa--,1)}}}}}return ab};F.matches=function(T,U){return F(T,null,null,U)};F.find=function(aa,T,ab){var Z,X;if(!aa){return[]}for(var W=0,V=I.order.length;W<V;W++){var Y=I.order[W],X;if((X=I.match[Y].exec(aa))){var U=RegExp.leftContext;if(U.substr(U.length-1)!=="\\"){X[1]=(X[1]||"").replace(/\\/g,"");Z=I.find[Y](X,T,ab);if(Z!=null){aa=aa.replace(I.match[Y],"");break}}}}if(!Z){Z=T.getElementsByTagName("*")}return{set:Z,expr:aa}};F.filter=function(ad,ac,ag,W){var V=ad,ai=[],aa=ac,Y,T,Z=ac&&ac[0]&&Q(ac[0]);while(ad&&ac.length){for(var ab in I.filter){if((Y=I.match[ab].exec(ad))!=null){var U=I.filter[ab],ah,af;T=false;if(aa==ai){ai=[]}if(I.preFilter[ab]){Y=I.preFilter[ab](Y,aa,ag,ai,W,Z);if(!Y){T=ah=true}else{if(Y===true){continue}}}if(Y){for(var X=0;(af=aa[X])!=null;X++){if(af){ah=U(af,Y,X,aa);var ae=W^!!ah;if(ag&&ah!=null){if(ae){T=true}else{aa[X]=false}}else{if(ae){ai.push(af);T=true}}}}}if(ah!==g){if(!ag){aa=ai}ad=ad.replace(I.match[ab],"");if(!T){return[]}break}}}if(ad==V){if(T==null){throw"Syntax error, unrecognized expression: "+ad}else{break}}V=ad}return aa};var I=F.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF_-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF_-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*_-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF_-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(T){return T.getAttribute("href")}},relative:{"+":function(aa,T,Z){var X=typeof T==="string",ab=X&&!/\W/.test(T),Y=X&&!ab;if(ab&&!Z){T=T.toUpperCase()}for(var W=0,V=aa.length,U;W<V;W++){if((U=aa[W])){while((U=U.previousSibling)&&U.nodeType!==1){}aa[W]=Y||U&&U.nodeName===T?U||false:U===T}}if(Y){F.filter(T,aa,true)}},">":function(Z,U,aa){var X=typeof U==="string";if(X&&!/\W/.test(U)){U=aa?U:U.toUpperCase();for(var V=0,T=Z.length;V<T;V++){var Y=Z[V];if(Y){var W=Y.parentNode;Z[V]=W.nodeName===U?W:false}}}else{for(var V=0,T=Z.length;V<T;V++){var Y=Z[V];if(Y){Z[V]=X?Y.parentNode:Y.parentNode===U}}if(X){F.filter(U,Z,true)}}},"":function(W,U,Y){var V=L++,T=S;if(!U.match(/\W/)){var X=U=Y?U:U.toUpperCase();T=P}T("parentNode",U,V,W,X,Y)},"~":function(W,U,Y){var V=L++,T=S;if(typeof U==="string"&&!U.match(/\W/)){var X=U=Y?U:U.toUpperCase();T=P}T("previousSibling",U,V,W,X,Y)}},find:{ID:function(U,V,W){if(typeof V.getElementById!=="undefined"&&!W){var T=V.getElementById(U[1]);return T?[T]:[]}},NAME:function(V,Y,Z){if(typeof Y.getElementsByName!=="undefined"){var U=[],X=Y.getElementsByName(V[1]);for(var W=0,T=X.length;W<T;W++){if(X[W].getAttribute("name")===V[1]){U.push(X[W])}}return U.length===0?null:U}},TAG:function(T,U){return U.getElementsByTagName(T[1])}},preFilter:{CLASS:function(W,U,V,T,Z,aa){W=" "+W[1].replace(/\\/g,"")+" ";if(aa){return W}for(var X=0,Y;(Y=U[X])!=null;X++){if(Y){if(Z^(Y.className&&(" "+Y.className+" ").indexOf(W)>=0)){if(!V){T.push(Y)}}else{if(V){U[X]=false}}}}return false},ID:function(T){return T[1].replace(/\\/g,"")},TAG:function(U,T){for(var V=0;T[V]===false;V++){}return T[V]&&Q(T[V])?U[1]:U[1].toUpperCase()},CHILD:function(T){if(T[1]=="nth"){var U=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(T[2]=="even"&&"2n"||T[2]=="odd"&&"2n+1"||!/\D/.test(T[2])&&"0n+"+T[2]||T[2]);T[2]=(U[1]+(U[2]||1))-0;T[3]=U[3]-0}T[0]=L++;return T},ATTR:function(X,U,V,T,Y,Z){var W=X[1].replace(/\\/g,"");if(!Z&&I.attrMap[W]){X[1]=I.attrMap[W]}if(X[2]==="~="){X[4]=" "+X[4]+" "}return X},PSEUDO:function(X,U,V,T,Y){if(X[1]==="not"){if(X[3].match(R).length>1||/^\w/.test(X[3])){X[3]=F(X[3],null,null,U)}else{var W=F.filter(X[3],U,V,true^Y);if(!V){T.push.apply(T,W)}return false}}else{if(I.match.POS.test(X[0])||I.match.CHILD.test(X[0])){return true}}return X},POS:function(T){T.unshift(true);return T}},filters:{enabled:function(T){return T.disabled===false&&T.type!=="hidden"},disabled:function(T){return T.disabled===true},checked:function(T){return T.checked===true},selected:function(T){T.parentNode.selectedIndex;return T.selected===true},parent:function(T){return !!T.firstChild},empty:function(T){return !T.firstChild},has:function(V,U,T){return !!F(T[3],V).length},header:function(T){return/h\d/i.test(T.nodeName)},text:function(T){return"text"===T.type},radio:function(T){return"radio"===T.type},checkbox:function(T){return"checkbox"===T.type},file:function(T){return"file"===T.type},password:function(T){return"password"===T.type},submit:function(T){return"submit"===T.type},image:function(T){return"image"===T.type},reset:function(T){return"reset"===T.type},button:function(T){return"button"===T.type||T.nodeName.toUpperCase()==="BUTTON"},input:function(T){return/input|select|textarea|button/i.test(T.nodeName)}},setFilters:{first:function(U,T){return T===0},last:function(V,U,T,W){return U===W.length-1},even:function(U,T){return T%2===0},odd:function(U,T){return T%2===1},lt:function(V,U,T){return U<T[3]-0},gt:function(V,U,T){return U>T[3]-0},nth:function(V,U,T){return T[3]-0==U},eq:function(V,U,T){return T[3]-0==U}},filter:{PSEUDO:function(Z,V,W,aa){var U=V[1],X=I.filters[U];if(X){return X(Z,W,V,aa)}else{if(U==="contains"){return(Z.textContent||Z.innerText||"").indexOf(V[3])>=0}else{if(U==="not"){var Y=V[3];for(var W=0,T=Y.length;W<T;W++){if(Y[W]===Z){return false}}return true}}}},CHILD:function(T,W){var Z=W[1],U=T;switch(Z){case"only":case"first":while(U=U.previousSibling){if(U.nodeType===1){return false}}if(Z=="first"){return true}U=T;case"last":while(U=U.nextSibling){if(U.nodeType===1){return false}}return true;case"nth":var V=W[2],ac=W[3];if(V==1&&ac==0){return true}var Y=W[0],ab=T.parentNode;if(ab&&(ab.sizcache!==Y||!T.nodeIndex)){var X=0;for(U=ab.firstChild;U;U=U.nextSibling){if(U.nodeType===1){U.nodeIndex=++X}}ab.sizcache=Y}var aa=T.nodeIndex-ac;if(V==0){return aa==0}else{return(aa%V==0&&aa/V>=0)}}},ID:function(U,T){return U.nodeType===1&&U.getAttribute("id")===T},TAG:function(U,T){return(T==="*"&&U.nodeType===1)||U.nodeName===T},CLASS:function(U,T){return(" "+(U.className||U.getAttribute("class"))+" ").indexOf(T)>-1},ATTR:function(Y,W){var V=W[1],T=I.attrHandle[V]?I.attrHandle[V](Y):Y[V]!=null?Y[V]:Y.getAttribute(V),Z=T+"",X=W[2],U=W[4];return T==null?X==="!=":X==="="?Z===U:X==="*="?Z.indexOf(U)>=0:X==="~="?(" "+Z+" ").indexOf(U)>=0:!U?Z&&T!==false:X==="!="?Z!=U:X==="^="?Z.indexOf(U)===0:X==="$="?Z.substr(Z.length-U.length)===U:X==="|="?Z===U||Z.substr(0,U.length+1)===U+"-":false},POS:function(X,U,V,Y){var T=U[2],W=I.setFilters[T];if(W){return W(X,V,U,Y)}}}};var M=I.match.POS;for(var O in I.match){I.match[O]=RegExp(I.match[O].source+/(?![^\[]*\])(?![^\(]*\))/.source)}var E=function(U,T){U=Array.prototype.slice.call(U);if(T){T.push.apply(T,U);return T}return U};try{Array.prototype.slice.call(document.documentElement.childNodes)}catch(N){E=function(X,W){var U=W||[];if(H.call(X)==="[object Array]"){Array.prototype.push.apply(U,X)}else{if(typeof X.length==="number"){for(var V=0,T=X.length;V<T;V++){U.push(X[V])}}else{for(var V=0;X[V];V++){U.push(X[V])}}}return U}}var G;if(document.documentElement.compareDocumentPosition){G=function(U,T){var V=U.compareDocumentPosition(T)&4?-1:U===T?0:1;if(V===0){hasDuplicate=true}return V}}else{if("sourceIndex" in document.documentElement){G=function(U,T){var V=U.sourceIndex-T.sourceIndex;if(V===0){hasDuplicate=true}return V}}else{if(document.createRange){G=function(W,U){var V=W.ownerDocument.createRange(),T=U.ownerDocument.createRange();V.selectNode(W);V.collapse(true);T.selectNode(U);T.collapse(true);var X=V.compareBoundaryPoints(Range.START_TO_END,T);if(X===0){hasDuplicate=true}return X}}}}(function(){var U=document.createElement("form"),V="script"+(new Date).getTime();U.innerHTML="<input name='"+V+"'/>";var T=document.documentElement;T.insertBefore(U,T.firstChild);if(!!document.getElementById(V)){I.find.ID=function(X,Y,Z){if(typeof Y.getElementById!=="undefined"&&!Z){var W=Y.getElementById(X[1]);return W?W.id===X[1]||typeof W.getAttributeNode!=="undefined"&&W.getAttributeNode("id").nodeValue===X[1]?[W]:g:[]}};I.filter.ID=function(Y,W){var X=typeof Y.getAttributeNode!=="undefined"&&Y.getAttributeNode("id");return Y.nodeType===1&&X&&X.nodeValue===W}}T.removeChild(U)})();(function(){var T=document.createElement("div");T.appendChild(document.createComment(""));if(T.getElementsByTagName("*").length>0){I.find.TAG=function(U,Y){var X=Y.getElementsByTagName(U[1]);if(U[1]==="*"){var W=[];for(var V=0;X[V];V++){if(X[V].nodeType===1){W.push(X[V])}}X=W}return X}}T.innerHTML="<a href='#'></a>";if(T.firstChild&&typeof T.firstChild.getAttribute!=="undefined"&&T.firstChild.getAttribute("href")!=="#"){I.attrHandle.href=function(U){return U.getAttribute("href",2)}}})();if(document.querySelectorAll){(function(){var T=F,U=document.createElement("div");U.innerHTML="<p class='TEST'></p>";if(U.querySelectorAll&&U.querySelectorAll(".TEST").length===0){return}F=function(Y,X,V,W){X=X||document;if(!W&&X.nodeType===9&&!Q(X)){try{return E(X.querySelectorAll(Y),V)}catch(Z){}}return T(Y,X,V,W)};F.find=T.find;F.filter=T.filter;F.selectors=T.selectors;F.matches=T.matches})()}if(document.getElementsByClassName&&document.documentElement.getElementsByClassName){(function(){var T=document.createElement("div");T.innerHTML="<div class='test e'></div><div class='test'></div>";if(T.getElementsByClassName("e").length===0){return}T.lastChild.className="e";if(T.getElementsByClassName("e").length===1){return}I.order.splice(1,0,"CLASS");I.find.CLASS=function(U,V,W){if(typeof V.getElementsByClassName!=="undefined"&&!W){return V.getElementsByClassName(U[1])}}})()}function P(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W<V;W++){var T=ad[W];if(T){if(ab&&T.nodeType===1){T.sizcache=Y;T.sizset=W}T=T[U];var X=false;while(T){if(T.sizcache===Y){X=ad[T.sizset];break}if(T.nodeType===1&&!ac){T.sizcache=Y;T.sizset=W}if(T.nodeName===Z){X=T;break}T=T[U]}ad[W]=X}}}function S(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W<V;W++){var T=ad[W];if(T){if(ab&&T.nodeType===1){T.sizcache=Y;T.sizset=W}T=T[U];var X=false;while(T){if(T.sizcache===Y){X=ad[T.sizset];break}if(T.nodeType===1){if(!ac){T.sizcache=Y;T.sizset=W}if(typeof Z!=="string"){if(T===Z){X=true;break}}else{if(F.filter(Z,[T]).length>0){X=T;break}}}T=T[U]}ad[W]=X}}}var K=document.compareDocumentPosition?function(U,T){return U.compareDocumentPosition(T)&16}:function(U,T){return U!==T&&(U.contains?U.contains(T):true)};var Q=function(T){return T.nodeType===9&&T.documentElement.nodeName!=="HTML"||!!T.ownerDocument&&Q(T.ownerDocument)};var J=function(T,aa){var W=[],X="",Y,V=aa.nodeType?[aa]:aa;while((Y=I.match.PSEUDO.exec(T))){X+=Y[0];T=T.replace(I.match.PSEUDO,"")}T=I.relative[T]?T+"*":T;for(var Z=0,U=V.length;Z<U;Z++){F(T,V[Z],W)}return F.filter(X,W)};o.find=F;o.filter=F.filter;o.expr=F.selectors;o.expr[":"]=o.expr.filters;F.selectors.filters.hidden=function(T){return T.offsetWidth===0||T.offsetHeight===0};F.selectors.filters.visible=function(T){return T.offsetWidth>0||T.offsetHeight>0};F.selectors.filters.animated=function(T){return o.grep(o.timers,function(U){return T===U.elem}).length};o.multiFilter=function(V,T,U){if(U){V=":not("+V+")"}return F.matches(V,T)};o.dir=function(V,U){var T=[],W=V[U];while(W&&W!=document){if(W.nodeType==1){T.push(W)}W=W[U]}return T};o.nth=function(X,T,V,W){T=T||1;var U=0;for(;X;X=X[V]){if(X.nodeType==1&&++U==T){break}}return X};o.sibling=function(V,U){var T=[];for(;V;V=V.nextSibling){if(V.nodeType==1&&V!=U){T.push(V)}}return T};return;l.Sizzle=F})();o.event={add:function(I,F,H,K){if(I.nodeType==3||I.nodeType==8){return}if(I.setInterval&&I!=l){I=l}if(!H.guid){H.guid=this.guid++}if(K!==g){var G=H;H=this.proxy(G);H.data=K}var E=o.data(I,"events")||o.data(I,"events",{}),J=o.data(I,"handle")||o.data(I,"handle",function(){return typeof o!=="undefined"&&!o.event.triggered?o.event.handle.apply(arguments.callee.elem,arguments):g});J.elem=I;o.each(F.split(/\s+/),function(M,N){var O=N.split(".");N=O.shift();H.type=O.slice().sort().join(".");var L=E[N];if(o.event.specialAll[N]){o.event.specialAll[N].setup.call(I,K,O)}if(!L){L=E[N]={};if(!o.event.special[N]||o.event.special[N].setup.call(I,K,O)===false){if(I.addEventListener){I.addEventListener(N,J,false)}else{if(I.attachEvent){I.attachEvent("on"+N,J)}}}}L[H.guid]=H;o.event.global[N]=true});I=null},guid:1,global:{},remove:function(K,H,J){if(K.nodeType==3||K.nodeType==8){return}var G=o.data(K,"events"),F,E;if(G){if(H===g||(typeof H==="string"&&H.charAt(0)==".")){for(var I in G){this.remove(K,I+(H||""))}}else{if(H.type){J=H.handler;H=H.type}o.each(H.split(/\s+/),function(M,O){var Q=O.split(".");O=Q.shift();var N=RegExp("(^|\\.)"+Q.slice().sort().join(".*\\.")+"(\\.|$)");if(G[O]){if(J){delete G[O][J.guid]}else{for(var P in G[O]){if(N.test(G[O][P].type)){delete G[O][P]}}}if(o.event.specialAll[O]){o.event.specialAll[O].teardown.call(K,Q)}for(F in G[O]){break}if(!F){if(!o.event.special[O]||o.event.special[O].teardown.call(K,Q)===false){if(K.removeEventListener){K.removeEventListener(O,o.data(K,"handle"),false)}else{if(K.detachEvent){K.detachEvent("on"+O,o.data(K,"handle"))}}}F=null;delete G[O]}}})}for(F in G){break}if(!F){var L=o.data(K,"handle");if(L){L.elem=null}o.removeData(K,"events");o.removeData(K,"handle")}}},trigger:function(I,K,H,E){var G=I.type||I;if(!E){I=typeof I==="object"?I[h]?I:o.extend(o.Event(G),I):o.Event(G);if(G.indexOf("!")>=0){I.type=G=G.slice(0,-1);I.exclusive=true}if(!H){I.stopPropagation();if(this.global[G]){o.each(o.cache,function(){if(this.events&&this.events[G]){o.event.trigger(I,K,this.handle.elem)}})}}if(!H||H.nodeType==3||H.nodeType==8){return g}I.result=g;I.target=H;K=o.makeArray(K);K.unshift(I)}I.currentTarget=H;var J=o.data(H,"handle");if(J){J.apply(H,K)}if((!H[G]||(o.nodeName(H,"a")&&G=="click"))&&H["on"+G]&&H["on"+G].apply(H,K)===false){I.result=false}if(!E&&H[G]&&!I.isDefaultPrevented()&&!(o.nodeName(H,"a")&&G=="click")){this.triggered=true;try{H[G]()}catch(L){}}this.triggered=false;if(!I.isPropagationStopped()){var F=H.parentNode||H.ownerDocument;if(F){o.event.trigger(I,K,F,true)}}},handle:function(K){var J,E;K=arguments[0]=o.event.fix(K||l.event);K.currentTarget=this;var L=K.type.split(".");K.type=L.shift();J=!L.length&&!K.exclusive;var I=RegExp("(^|\\.)"+L.slice().sort().join(".*\\.")+"(\\.|$)");E=(o.data(this,"events")||{})[K.type];for(var G in E){var H=E[G];if(J||I.test(H.type)){K.handler=H;K.data=H.data;var F=H.apply(this,arguments);if(F!==g){K.result=F;if(F===false){K.preventDefault();K.stopPropagation()}}if(K.isImmediatePropagationStopped()){break}}}},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(H){if(H[h]){return H}var F=H;H=o.Event(F);for(var G=this.props.length,J;G;){J=this.props[--G];H[J]=F[J]}if(!H.target){H.target=H.srcElement||document}if(H.target.nodeType==3){H.target=H.target.parentNode}if(!H.relatedTarget&&H.fromElement){H.relatedTarget=H.fromElement==H.target?H.toElement:H.fromElement}if(H.pageX==null&&H.clientX!=null){var I=document.documentElement,E=document.body;H.pageX=H.clientX+(I&&I.scrollLeft||E&&E.scrollLeft||0)-(I.clientLeft||0);H.pageY=H.clientY+(I&&I.scrollTop||E&&E.scrollTop||0)-(I.clientTop||0)}if(!H.which&&((H.charCode||H.charCode===0)?H.charCode:H.keyCode)){H.which=H.charCode||H.keyCode}if(!H.metaKey&&H.ctrlKey){H.metaKey=H.ctrlKey}if(!H.which&&H.button){H.which=(H.button&1?1:(H.button&2?3:(H.button&4?2:0)))}return H},proxy:function(F,E){E=E||function(){return F.apply(this,arguments)};E.guid=F.guid=F.guid||E.guid||this.guid++;return E},special:{ready:{setup:B,teardown:function(){}}},specialAll:{live:{setup:function(E,F){o.event.add(this,F[0],c)},teardown:function(G){if(G.length){var E=0,F=RegExp("(^|\\.)"+G[0]+"(\\.|$)");o.each((o.data(this,"events").live||{}),function(){if(F.test(this.type)){E++}});if(E<1){o.event.remove(this,G[0],c)}}}}}};o.Event=function(E){if(!this.preventDefault){return new o.Event(E)}if(E&&E.type){this.originalEvent=E;this.type=E.type}else{this.type=E}this.timeStamp=e();this[h]=true};function k(){return false}function u(){return true}o.Event.prototype={preventDefault:function(){this.isDefaultPrevented=u;var E=this.originalEvent;if(!E){return}if(E.preventDefault){E.preventDefault()}E.returnValue=false},stopPropagation:function(){this.isPropagationStopped=u;var E=this.originalEvent;if(!E){return}if(E.stopPropagation){E.stopPropagation()}E.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=u;this.stopPropagation()},isDefaultPrevented:k,isPropagationStopped:k,isImmediatePropagationStopped:k};var a=function(F){var E=F.relatedTarget;while(E&&E!=this){try{E=E.parentNode}catch(G){E=this}}if(E!=this){F.type=F.data;o.event.handle.apply(this,arguments)}};o.each({mouseover:"mouseenter",mouseout:"mouseleave"},function(F,E){o.event.special[E]={setup:function(){o.event.add(this,F,a,E)},teardown:function(){o.event.remove(this,F,a)}}});o.fn.extend({bind:function(F,G,E){return F=="unload"?this.one(F,G,E):this.each(function(){o.event.add(this,F,E||G,E&&G)})},one:function(G,H,F){var E=o.event.proxy(F||H,function(I){o(this).unbind(I,E);return(F||H).apply(this,arguments)});return this.each(function(){o.event.add(this,G,E,F&&H)})},unbind:function(F,E){return this.each(function(){o.event.remove(this,F,E)})},trigger:function(E,F){return this.each(function(){o.event.trigger(E,F,this)})},triggerHandler:function(E,G){if(this[0]){var F=o.Event(E);F.preventDefault();F.stopPropagation();o.event.trigger(F,G,this[0]);return F.result}},toggle:function(G){var E=arguments,F=1;while(F<E.length){o.event.proxy(G,E[F++])}return this.click(o.event.proxy(G,function(H){this.lastToggle=(this.lastToggle||0)%F;H.preventDefault();return E[this.lastToggle++].apply(this,arguments)||false}))},hover:function(E,F){return this.mouseenter(E).mouseleave(F)},ready:function(E){B();if(o.isReady){E.call(document,o)}else{o.readyList.push(E)}return this},live:function(G,F){var E=o.event.proxy(F);E.guid+=this.selector+G;o(document).bind(i(G,this.selector),this.selector,E);return this},die:function(F,E){o(document).unbind(i(F,this.selector),E?{guid:E.guid+this.selector+F}:null);return this}});function c(H){var E=RegExp("(^|\\.)"+H.type+"(\\.|$)"),G=true,F=[];o.each(o.data(this,"events").live||[],function(I,J){if(E.test(J.type)){var K=o(H.target).closest(J.data)[0];if(K){F.push({elem:K,fn:J})}}});F.sort(function(J,I){return o.data(J.elem,"closest")-o.data(I.elem,"closest")});o.each(F,function(){if(this.fn.call(this.elem,H,this.fn.data)===false){return(G=false)}});return G}function i(F,E){return["live",F,E.replace(/\./g,"`").replace(/ /g,"|")].join(".")}o.extend({isReady:false,readyList:[],ready:function(){if(!o.isReady){o.isReady=true;if(o.readyList){o.each(o.readyList,function(){this.call(document,o)});o.readyList=null}o(document).triggerHandler("ready")}}});var x=false;function B(){if(x){return}x=true;if(document.addEventListener){document.addEventListener("DOMContentLoaded",function(){document.removeEventListener("DOMContentLoaded",arguments.callee,false);o.ready()},false)}else{if(document.attachEvent){document.attachEvent("onreadystatechange",function(){if(document.readyState==="complete"){document.detachEvent("onreadystatechange",arguments.callee);o.ready()}});if(document.documentElement.doScroll&&l==l.top){(function(){if(o.isReady){return}try{document.documentElement.doScroll("left")}catch(E){setTimeout(arguments.callee,0);return}o.ready()})()}}}o.event.add(l,"load",o.ready)}o.each(("blur,focus,load,resize,scroll,unload,click,dblclick,mousedown,mouseup,mousemove,mouseover,mouseout,mouseenter,mouseleave,change,select,submit,keydown,keypress,keyup,error").split(","),function(F,E){o.fn[E]=function(G){return G?this.bind(E,G):this.trigger(E)}});o(l).bind("unload",function(){for(var E in o.cache){if(E!=1&&o.cache[E].handle){o.event.remove(o.cache[E].handle.elem)}}});(function(){o.support={};var F=document.documentElement,G=document.createElement("script"),K=document.createElement("div"),J="script"+(new Date).getTime();K.style.display="none";K.innerHTML='   <link/><table></table><a href="/a" style="color:red;float:left;opacity:.5;">a</a><select><option>text</option></select><object><param/></object>';var H=K.getElementsByTagName("*"),E=K.getElementsByTagName("a")[0];if(!H||!H.length||!E){return}o.support={leadingWhitespace:K.firstChild.nodeType==3,tbody:!K.getElementsByTagName("tbody").length,objectAll:!!K.getElementsByTagName("object")[0].getElementsByTagName("*").length,htmlSerialize:!!K.getElementsByTagName("link").length,style:/red/.test(E.getAttribute("style")),hrefNormalized:E.getAttribute("href")==="/a",opacity:E.style.opacity==="0.5",cssFloat:!!E.style.cssFloat,scriptEval:false,noCloneEvent:true,boxModel:null};G.type="text/javascript";try{G.appendChild(document.createTextNode("window."+J+"=1;"))}catch(I){}F.insertBefore(G,F.firstChild);if(l[J]){o.support.scriptEval=true;delete l[J]}F.removeChild(G);if(K.attachEvent&&K.fireEvent){K.attachEvent("onclick",function(){o.support.noCloneEvent=false;K.detachEvent("onclick",arguments.callee)});K.cloneNode(true).fireEvent("onclick")}o(function(){var L=document.createElement("div");L.style.width=L.style.paddingLeft="1px";document.body.appendChild(L);o.boxModel=o.support.boxModel=L.offsetWidth===2;document.body.removeChild(L).style.display="none"})})();var w=o.support.cssFloat?"cssFloat":"styleFloat";o.props={"for":"htmlFor","class":"className","float":w,cssFloat:w,styleFloat:w,readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",tabindex:"tabIndex"};o.fn.extend({_load:o.fn.load,load:function(G,J,K){if(typeof G!=="string"){return this._load(G)}var I=G.indexOf(" ");if(I>=0){var E=G.slice(I,G.length);G=G.slice(0,I)}var H="GET";if(J){if(o.isFunction(J)){K=J;J=null}else{if(typeof J==="object"){J=o.param(J);H="POST"}}}var F=this;o.ajax({url:G,type:H,dataType:"html",data:J,complete:function(M,L){if(L=="success"||L=="notmodified"){F.html(E?o("<div/>").append(M.responseText.replace(/<script(.|\s)*?\/script>/g,"")).find(E):M.responseText)}if(K){F.each(K,[M.responseText,L,M])}}});return this},serialize:function(){return o.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?o.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password|search/i.test(this.type))}).map(function(E,F){var G=o(this).val();return G==null?null:o.isArray(G)?o.map(G,function(I,H){return{name:F.name,value:I}}):{name:F.name,value:G}}).get()}});o.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(E,F){o.fn[F]=function(G){return this.bind(F,G)}});var r=e();o.extend({get:function(E,G,H,F){if(o.isFunction(G)){H=G;G=null}return o.ajax({type:"GET",url:E,data:G,success:H,dataType:F})},getScript:function(E,F){return o.get(E,null,F,"script")},getJSON:function(E,F,G){return o.get(E,F,G,"json")},post:function(E,G,H,F){if(o.isFunction(G)){H=G;G={}}return o.ajax({type:"POST",url:E,data:G,success:H,dataType:F})},ajaxSetup:function(E){o.extend(o.ajaxSettings,E)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return l.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest()},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(M){M=o.extend(true,M,o.extend(true,{},o.ajaxSettings,M));var W,F=/=\?(&|$)/g,R,V,G=M.type.toUpperCase();if(M.data&&M.processData&&typeof M.data!=="string"){M.data=o.param(M.data)}if(M.dataType=="jsonp"){if(G=="GET"){if(!M.url.match(F)){M.url+=(M.url.match(/\?/)?"&":"?")+(M.jsonp||"callback")+"=?"}}else{if(!M.data||!M.data.match(F)){M.data=(M.data?M.data+"&":"")+(M.jsonp||"callback")+"=?"}}M.dataType="json"}if(M.dataType=="json"&&(M.data&&M.data.match(F)||M.url.match(F))){W="jsonp"+r++;if(M.data){M.data=(M.data+"").replace(F,"="+W+"$1")}M.url=M.url.replace(F,"="+W+"$1");M.dataType="script";l[W]=function(X){V=X;I();L();l[W]=g;try{delete l[W]}catch(Y){}if(H){H.removeChild(T)}}}if(M.dataType=="script"&&M.cache==null){M.cache=false}if(M.cache===false&&G=="GET"){var E=e();var U=M.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+E+"$2");M.url=U+((U==M.url)?(M.url.match(/\?/)?"&":"?")+"_="+E:"")}if(M.data&&G=="GET"){M.url+=(M.url.match(/\?/)?"&":"?")+M.data;M.data=null}if(M.global&&!o.active++){o.event.trigger("ajaxStart")}var Q=/^(\w+:)?\/\/([^\/?#]+)/.exec(M.url);if(M.dataType=="script"&&G=="GET"&&Q&&(Q[1]&&Q[1]!=location.protocol||Q[2]!=location.host)){var H=document.getElementsByTagName("head")[0];var T=document.createElement("script");T.src=M.url;if(M.scriptCharset){T.charset=M.scriptCharset}if(!W){var O=false;T.onload=T.onreadystatechange=function(){if(!O&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){O=true;I();L();T.onload=T.onreadystatechange=null;H.removeChild(T)}}}H.appendChild(T);return g}var K=false;var J=M.xhr();if(M.username){J.open(G,M.url,M.async,M.username,M.password)}else{J.open(G,M.url,M.async)}try{if(M.data){J.setRequestHeader("Content-Type",M.contentType)}if(M.ifModified){J.setRequestHeader("If-Modified-Since",o.lastModified[M.url]||"Thu, 01 Jan 1970 00:00:00 GMT")}J.setRequestHeader("X-Requested-With","XMLHttpRequest");J.setRequestHeader("Accept",M.dataType&&M.accepts[M.dataType]?M.accepts[M.dataType]+", */*":M.accepts._default)}catch(S){}if(M.beforeSend&&M.beforeSend(J,M)===false){if(M.global&&!--o.active){o.event.trigger("ajaxStop")}J.abort();return false}if(M.global){o.event.trigger("ajaxSend",[J,M])}var N=function(X){if(J.readyState==0){if(P){clearInterval(P);P=null;if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}}else{if(!K&&J&&(J.readyState==4||X=="timeout")){K=true;if(P){clearInterval(P);P=null}R=X=="timeout"?"timeout":!o.httpSuccess(J)?"error":M.ifModified&&o.httpNotModified(J,M.url)?"notmodified":"success";if(R=="success"){try{V=o.httpData(J,M.dataType,M)}catch(Z){R="parsererror"}}if(R=="success"){var Y;try{Y=J.getResponseHeader("Last-Modified")}catch(Z){}if(M.ifModified&&Y){o.lastModified[M.url]=Y}if(!W){I()}}else{o.handleError(M,J,R)}L();if(X){J.abort()}if(M.async){J=null}}}};if(M.async){var P=setInterval(N,13);if(M.timeout>0){setTimeout(function(){if(J&&!K){N("timeout")}},M.timeout)}}try{J.send(M.data)}catch(S){o.handleError(M,J,null,S)}if(!M.async){N()}function I(){if(M.success){M.success(V,R)}if(M.global){o.event.trigger("ajaxSuccess",[J,M])}}function L(){if(M.complete){M.complete(J,R)}if(M.global){o.event.trigger("ajaxComplete",[J,M])}if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}return J},handleError:function(F,H,E,G){if(F.error){F.error(H,E,G)}if(F.global){o.event.trigger("ajaxError",[H,F,G])}},active:0,httpSuccess:function(F){try{return !F.status&&location.protocol=="file:"||(F.status>=200&&F.status<300)||F.status==304||F.status==1223}catch(E){}return false},httpNotModified:function(G,E){try{var H=G.getResponseHeader("Last-Modified");return G.status==304||H==o.lastModified[E]}catch(F){}return false},httpData:function(J,H,G){var F=J.getResponseHeader("content-type"),E=H=="xml"||!H&&F&&F.indexOf("xml")>=0,I=E?J.responseXML:J.responseText;if(E&&I.documentElement.tagName=="parsererror"){throw"parsererror"}if(G&&G.dataFilter){I=G.dataFilter(I,H)}if(typeof I==="string"){if(H=="script"){o.globalEval(I)}if(H=="json"){I=l["eval"]("("+I+")")}}return I},param:function(E){var G=[];function H(I,J){G[G.length]=encodeURIComponent(I)+"="+encodeURIComponent(J)}if(o.isArray(E)||E.jquery){o.each(E,function(){H(this.name,this.value)})}else{for(var F in E){if(o.isArray(E[F])){o.each(E[F],function(){H(F,this)})}else{H(F,o.isFunction(E[F])?E[F]():E[F])}}}return G.join("&").replace(/%20/g,"+")}});var m={},n,d=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];function t(F,E){var G={};o.each(d.concat.apply([],d.slice(0,E)),function(){G[this]=F});return G}o.fn.extend({show:function(J,L){if(J){return this.animate(t("show",3),J,L)}else{for(var H=0,F=this.length;H<F;H++){var E=o.data(this[H],"olddisplay");this[H].style.display=E||"";if(o.css(this[H],"display")==="none"){var G=this[H].tagName,K;if(m[G]){K=m[G]}else{var I=o("<"+G+" />").appendTo("body");K=I.css("display");if(K==="none"){K="block"}I.remove();m[G]=K}o.data(this[H],"olddisplay",K)}}for(var H=0,F=this.length;H<F;H++){this[H].style.display=o.data(this[H],"olddisplay")||""}return this}},hide:function(H,I){if(H){return this.animate(t("hide",3),H,I)}else{for(var G=0,F=this.length;G<F;G++){var E=o.data(this[G],"olddisplay");if(!E&&E!=="none"){o.data(this[G],"olddisplay",o.css(this[G],"display"))}}for(var G=0,F=this.length;G<F;G++){this[G].style.display="none"}return this}},_toggle:o.fn.toggle,toggle:function(G,F){var E=typeof G==="boolean";return o.isFunction(G)&&o.isFunction(F)?this._toggle.apply(this,arguments):G==null||E?this.each(function(){var H=E?G:o(this).is(":hidden");o(this)[H?"show":"hide"]()}):this.animate(t("toggle",3),G,F)},fadeTo:function(E,G,F){return this.animate({opacity:G},E,F)},animate:function(I,F,H,G){var E=o.speed(F,H,G);return this[E.queue===false?"each":"queue"](function(){var K=o.extend({},E),M,L=this.nodeType==1&&o(this).is(":hidden"),J=this;for(M in I){if(I[M]=="hide"&&L||I[M]=="show"&&!L){return K.complete.call(this)}if((M=="height"||M=="width")&&this.style){K.display=o.css(this,"display");K.overflow=this.style.overflow}}if(K.overflow!=null){this.style.overflow="hidden"}K.curAnim=o.extend({},I);o.each(I,function(O,S){var R=new o.fx(J,K,O);if(/toggle|show|hide/.test(S)){R[S=="toggle"?L?"show":"hide":S](I)}else{var Q=S.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),T=R.cur(true)||0;if(Q){var N=parseFloat(Q[2]),P=Q[3]||"px";if(P!="px"){J.style[O]=(N||1)+P;T=((N||1)/R.cur(true))*T;J.style[O]=T+P}if(Q[1]){N=((Q[1]=="-="?-1:1)*N)+T}R.custom(T,N,P)}else{R.custom(T,S,"")}}});return true})},stop:function(F,E){var G=o.timers;if(F){this.queue([])}this.each(function(){for(var H=G.length-1;H>=0;H--){if(G[H].elem==this){if(E){G[H](true)}G.splice(H,1)}}});if(!E){this.dequeue()}return this}});o.each({slideDown:t("show",1),slideUp:t("hide",1),slideToggle:t("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(E,F){o.fn[E]=function(G,H){return this.animate(F,G,H)}});o.extend({speed:function(G,H,F){var E=typeof G==="object"?G:{complete:F||!F&&H||o.isFunction(G)&&G,duration:G,easing:F&&H||H&&!o.isFunction(H)&&H};E.duration=o.fx.off?0:typeof E.duration==="number"?E.duration:o.fx.speeds[E.duration]||o.fx.speeds._default;E.old=E.complete;E.complete=function(){if(E.queue!==false){o(this).dequeue()}if(o.isFunction(E.old)){E.old.call(this)}};return E},easing:{linear:function(G,H,E,F){return E+F*G},swing:function(G,H,E,F){return((-Math.cos(G*Math.PI)/2)+0.5)*F+E}},timers:[],fx:function(F,E,G){this.options=E;this.elem=F;this.prop=G;if(!E.orig){E.orig={}}}});o.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(o.fx.step[this.prop]||o.fx.step._default)(this);if((this.prop=="height"||this.prop=="width")&&this.elem.style){this.elem.style.display="block"}},cur:function(F){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var E=parseFloat(o.css(this.elem,this.prop,F));return E&&E>-10000?E:parseFloat(o.curCSS(this.elem,this.prop))||0},custom:function(I,H,G){this.startTime=e();this.start=I;this.end=H;this.unit=G||this.unit||"px";this.now=this.start;this.pos=this.state=0;var E=this;function F(J){return E.step(J)}F.elem=this.elem;if(F()&&o.timers.push(F)&&!n){n=setInterval(function(){var K=o.timers;for(var J=0;J<K.length;J++){if(!K[J]()){K.splice(J--,1)}}if(!K.length){clearInterval(n);n=g}},13)}},show:function(){this.options.orig[this.prop]=o.attr(this.elem.style,this.prop);this.options.show=true;this.custom(this.prop=="width"||this.prop=="height"?1:0,this.cur());o(this.elem).show()},hide:function(){this.options.orig[this.prop]=o.attr(this.elem.style,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(H){var G=e();if(H||G>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var E=true;for(var F in this.options.curAnim){if(this.options.curAnim[F]!==true){E=false}}if(E){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(o.css(this.elem,"display")=="none"){this.elem.style.display="block"}}if(this.options.hide){o(this.elem).hide()}if(this.options.hide||this.options.show){for(var I in this.options.curAnim){o.attr(this.elem.style,I,this.options.orig[I])}}this.options.complete.call(this.elem)}return false}else{var J=G-this.startTime;this.state=J/this.options.duration;this.pos=o.easing[this.options.easing||(o.easing.swing?"swing":"linear")](this.state,J,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update()}return true}};o.extend(o.fx,{speeds:{slow:600,fast:200,_default:400},step:{opacity:function(E){o.attr(E.elem.style,"opacity",E.now)},_default:function(E){if(E.elem.style&&E.elem.style[E.prop]!=null){E.elem.style[E.prop]=E.now+E.unit}else{E.elem[E.prop]=E.now}}}});if(document.documentElement.getBoundingClientRect){o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}var G=this[0].getBoundingClientRect(),J=this[0].ownerDocument,F=J.body,E=J.documentElement,L=E.clientTop||F.clientTop||0,K=E.clientLeft||F.clientLeft||0,I=G.top+(self.pageYOffset||o.boxModel&&E.scrollTop||F.scrollTop)-L,H=G.left+(self.pageXOffset||o.boxModel&&E.scrollLeft||F.scrollLeft)-K;return{top:I,left:H}}}else{o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}o.offset.initialized||o.offset.initialize();var J=this[0],G=J.offsetParent,F=J,O=J.ownerDocument,M,H=O.documentElement,K=O.body,L=O.defaultView,E=L.getComputedStyle(J,null),N=J.offsetTop,I=J.offsetLeft;while((J=J.parentNode)&&J!==K&&J!==H){M=L.getComputedStyle(J,null);N-=J.scrollTop,I-=J.scrollLeft;if(J===G){N+=J.offsetTop,I+=J.offsetLeft;if(o.offset.doesNotAddBorder&&!(o.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(J.tagName))){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}F=G,G=J.offsetParent}if(o.offset.subtractsBorderForOverflowNotVisible&&M.overflow!=="visible"){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}E=M}if(E.position==="relative"||E.position==="static"){N+=K.offsetTop,I+=K.offsetLeft}if(E.position==="fixed"){N+=Math.max(H.scrollTop,K.scrollTop),I+=Math.max(H.scrollLeft,K.scrollLeft)}return{top:N,left:I}}}o.offset={initialize:function(){if(this.initialized){return}var L=document.body,F=document.createElement("div"),H,G,N,I,M,E,J=L.style.marginTop,K='<div style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;"><div></div></div><table style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;" cellpadding="0" cellspacing="0"><tr><td></td></tr></table>';M={position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"};for(E in M){F.style[E]=M[E]}F.innerHTML=K;L.insertBefore(F,L.firstChild);H=F.firstChild,G=H.firstChild,I=H.nextSibling.firstChild.firstChild;this.doesNotAddBorder=(G.offsetTop!==5);this.doesAddBorderForTableAndCells=(I.offsetTop===5);H.style.overflow="hidden",H.style.position="relative";this.subtractsBorderForOverflowNotVisible=(G.offsetTop===-5);L.style.marginTop="1px";this.doesNotIncludeMarginInBodyOffset=(L.offsetTop===0);L.style.marginTop=J;L.removeChild(F);this.initialized=true},bodyOffset:function(E){o.offset.initialized||o.offset.initialize();var G=E.offsetTop,F=E.offsetLeft;if(o.offset.doesNotIncludeMarginInBodyOffset){G+=parseInt(o.curCSS(E,"marginTop",true),10)||0,F+=parseInt(o.curCSS(E,"marginLeft",true),10)||0}return{top:G,left:F}}};o.fn.extend({position:function(){var I=0,H=0,F;if(this[0]){var G=this.offsetParent(),J=this.offset(),E=/^body|html$/i.test(G[0].tagName)?{top:0,left:0}:G.offset();J.top-=j(this,"marginTop");J.left-=j(this,"marginLeft");E.top+=j(G,"borderTopWidth");E.left+=j(G,"borderLeftWidth");F={top:J.top-E.top,left:J.left-E.left}}return F},offsetParent:function(){var E=this[0].offsetParent||document.body;while(E&&(!/^body|html$/i.test(E.tagName)&&o.css(E,"position")=="static")){E=E.offsetParent}return o(E)}});o.each(["Left","Top"],function(F,E){var G="scroll"+E;o.fn[G]=function(H){if(!this[0]){return null}return H!==g?this.each(function(){this==l||this==document?l.scrollTo(!F?H:o(l).scrollLeft(),F?H:o(l).scrollTop()):this[G]=H}):this[0]==l||this[0]==document?self[F?"pageYOffset":"pageXOffset"]||o.boxModel&&document.documentElement[G]||document.body[G]:this[0][G]}});o.each(["Height","Width"],function(I,G){var E=I?"Left":"Top",H=I?"Right":"Bottom",F=G.toLowerCase();o.fn["inner"+G]=function(){return this[0]?o.css(this[0],F,false,"padding"):null};o.fn["outer"+G]=function(K){return this[0]?o.css(this[0],F,false,K?"margin":"border"):null};var J=G.toLowerCase();o.fn[J]=function(K){return this[0]==l?document.compatMode=="CSS1Compat"&&document.documentElement["client"+G]||document.body["client"+G]:this[0]==document?Math.max(document.documentElement["client"+G],document.body["scroll"+G],document.documentElement["scroll"+G],document.body["offset"+G],document.documentElement["offset"+G]):K===g?(this.length?o.css(this[0],J):null):this.css(J,typeof K==="string"?K:K+"px")}})})();/*
 * jQuery Impromptu
 * By: Trent Richardson [http://trentrichardson.com]
 * Version 1.2
 * Last Modified: 11/21/2007
 * 
 * Copyright 2007 Trent Richardson
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
function Queue(){
  var queue=new Array();
  var queueSpace=0;
  this.enqueue=function(element){
    queue.push(element);
  }
  this.dequeue=function(){
    if (queue.length){
      var element=queue[queueSpace];
      if (++queueSpace*2 >= queue.length){
        for (var i=queueSpace;i<queue.length;i++) queue[i-queueSpace]=queue[i];
        queue.length-=queueSpace;
        queueSpace=0;
      }
      return element;
    }else{
      return undefined;
    }
  }
}
jQuery.extend({	
	ImpromptuDefaults: { prefix:'jqi', buttons:{ Ok:true}, loaded:function(){}, onHtmlAtach:function(){}, submit:function(){return true;}, callback:function(){}, container:'body', opacity:0.6, overlayspeed:'slow', promptspeed:'fast', show:'show'},
	SetImpromptuDefaults: function(o){ 
		jQuery.ImpromptuDefaults = jQuery.extend({},jQuery.ImpromptuDefaults,o);
	},
	 
	promptFunctions: {
		next: function(){
			$.promptFunctions.isActive = false;
			var obj = $.promptFunctions.queue.dequeue();
			if(obj){
				$.doPrompt(obj.m, obj.o);
			}
		},
		queue: new Queue(),
		isActive: false
	},
	prompt: function(m, o){
		if($.promptFunctions.isActive){
			//alert(m);
			var obj = new Object;
			obj.m = m; obj.o = o;
			$.promptFunctions.queue.enqueue(obj);
		}else{
		
			$.doPrompt(m,o);
		}
	},
	doPrompt: function(m, o){
		$("#body").addClass("hiddenFlash");
	
	
		//alert("kkk");
		$.promptFunctions.isActive = true;
		o = jQuery.extend({},jQuery.ImpromptuDefaults,o);
		
		var ie6 = (jQuery.browser.msie && jQuery.browser.version < 7);	
		var b = (ie6)? jQuery(document.body):jQuery(o.container);	
		var fade = '<div class="'+ o.prefix +'fade" id="'+ o.prefix +'fade"></div>';

		var msgbox = '<div class="'+ o.prefix +'" id="'+ o.prefix +'"><div class="'+ o.prefix +'container"><div class="'+ o.prefix +'message">'+ m +'</div><div class="'+ o.prefix +'buttons" id="'+ o.prefix +'buttons">';
		// append buttons
		jQuery.each(o.buttons,function(k,v){
			
			msgbox += '<button name="'+ o.prefix +'button'+ k +'" id="'+ o.prefix +'button'+ k +'"';
			if(typeof(v)!="object"){
				msgbox +='value="'+ v +' class="'+k+'">'+ k +'</button>';
			}else{
				
				msgbox +='value="'+ v.value +'" class="'+k+'">'+ v.title +'</button>';
			}
		}) ;
		msgbox += '</div></div></div>';
		var jqi = b.append(msgbox).children('#'+ o.prefix);
		var jqif = b.append(fade).children('#'+ o.prefix +'fade');
		
		//ie6 calculation functions
		var getfoffset = function(){ return (document.documentElement.scrollTop || document.body.scrollTop) + 'px'; };
		var getjoffset = function(){ return (document.documentElement.scrollTop || document.body.scrollTop) + Math.round(15 * (document.documentElement.offsetHeight || document.body.clientHeight) / 100) + 'px'; };
		var ie6scroll = function(){ jqif.css({ top: getfoffset() }); jqi.css({ top: getjoffset() }); };
		
		jqif.css({ position: "absolute", height: (ie6)? "100%":b.height(), width: "100%", top: (ie6)? getfoffset():0, left: 0, right: 0, bottom: 0, zIndex: 998, display: "none", opacity: o.opacity });
		
		o.onHtmlAtach();
		
		jQuery('#'+ o.prefix +'buttons').children('button').click(function(){ 
			var msg = jqi.children('.'+ o.prefix +'container').children('.'+ o.prefix +'message');			
			//alert(jQuery(this).html());
			var clicked = o.buttons[jQuery(this).attr('class')];
			//alert(typeof(clicked));
			if(typeof(clicked)=="object"){
				clicked = clicked.value;
			}else{
				clicked = o.buttons[jQuery(this).text()];
			}
			if(o.submit(clicked,msg)){

				$("#body").removeClass("hiddenFlash");
				jqi.remove(); 
				if(ie6)jQuery(window).unbind('scroll',ie6scroll);//ie6, remove the scroll event
				jqif.fadeOut(o.overlayspeed,function(){
					jqif.remove();
					$.promptFunctions.next();
					o.callback(clicked,msg);
				});
			}
		});
				
		if(ie6) jQuery(window).scroll(ie6scroll);//ie6, add a scroll event to fix position:fixed
		jqif.fadeIn(o.overlayspeed);
		return jqi;
	}	
});
/*
 * Tabs 3 - New Wave Tabs
 *
 * Copyright (c) 2007 Klaus Hartl (stilbuero.de)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 */

(function($) {

    // if the UI scope is not availalable, add it
    $.ui = $.ui || {};

    // tabs initialization
    $.fn.tabs = function(initial, options) {
        if (initial && initial.constructor == Object) { // shift arguments
            options = initial;
            initial = null;
        }
        options = options || {};

        initial = initial && initial.constructor == Number && --initial || 0;

        return this.each(function() {
            new $.ui.tabs(this, $.extend(options, { initial: initial }));
        });
    };

    // other chainable tabs methods
    $.each(['Add', 'Remove', 'Enable', 'Disable', 'Click', 'Load'], function(i, method) {
        $.fn['tabs' + method] = function() {
            var args = arguments;
            return this.each(function() {
                var instance = $.ui.tabs.getInstance(this);
                instance[method.toLowerCase()].apply(instance, args);
            });
        };
    });
    $.fn.tabsSelected = function() {
        var selected = -1;
        if (this[0]) {
            var instance = $.ui.tabs.getInstance(this[0]),
                $lis = $('li', this);
            selected = $lis.index( $lis.filter('.' + instance.options.selectedClass)[0] );
        }
        return selected >= 0 ? ++selected : -1;
    };

    // tabs class
    $.ui.tabs = function(el, options) {

        this.source = el;

        this.options = $.extend({

            // basic setup
            initial: 0,
            event: 'click',
            disabled: [],
            // TODO bookmarkable: $.ajaxHistory ? true : false,
            unselected: false,
            unselect: options.unselected ? true : false,

            // Ajax
            spinner: 'Loading&#8230;',
            cache: false,
            idPrefix: 'tab-',

            // animations
            /*fxFade: null,
            fxSlide: null,
            fxShow: null,
            fxHide: null,*/
            fxSpeed: 'normal',
            /*fxShowSpeed: null,
            fxHideSpeed: null,*/

            // callbacks
            add: function() {},
            remove: function() {},
            enable: function() {},
            disable: function() {},
            click: function() {},
            hide: function() {},
            show: function() {},
            load: function() {},

            // CSS classes
            navClass: 'ui-tabs-nav',
            selectedClass: 'ui-tabs-selected',
            disabledClass: 'ui-tabs-disabled',
            containerClass: 'ui-tabs-container',
            hideClass: 'ui-tabs-hide',
            loadingClass: 'ui-tabs-loading'

        }, options);

        this.tabify(true);

        // save instance for later
        var uuid = 'tabs' + $.ui.tabs.prototype.count++;
        $.ui.tabs.instances[uuid] = this;
        $.data(el, 'tabsUUID', uuid);

    };

    // static
    $.ui.tabs.instances = {};
    $.ui.tabs.getInstance = function(el) {
        return $.ui.tabs.instances[$.data(el, 'tabsUUID')];
    };

    // instance methods
    $.extend($.ui.tabs.prototype, {
        count: 0,
        tabify: function(init) {

            this.$tabs = $('a:first-child', this.source);
            this.$containers = $([]);

            var self = this, o = this.options;
            
            this.$tabs.each(function(i, a) {
                // inline tab
                if (a.hash && a.hash.replace('#', '')) { // safari 2 reports '#' for an empty hash
                    self.$containers = self.$containers.add(a.hash);
                }
                // remote tab
                else {
                    $.data(a, 'href', a.href);
                    var id = a.title && a.title.replace(/\s/g, '_') || o.idPrefix + (self.count + 1) + '-' + (i + 1);
                    a.href = '#' + id;
                    self.$containers = self.$containers.add(
                        $('#' + id)[0] || $('<div id="' + id + '" class="' + o.containerClass + '"></div>')
                            .insertAfter( self.$containers[i - 1] || self.source )
                    );
                }
            });

            if (init) {

                // Try to retrieve initial tab from fragment identifier in url if present,
                // otherwise try to find selected class attribute on <li>.
                this.$tabs.each(function(i, a) {
                    if (location.hash) {
                        if (a.hash == location.hash) {
                            o.initial = i;
                            // prevent page scroll to fragment
                            //if (($.browser.msie || $.browser.opera) && !o.remote) {
                            if ($.browser.msie || $.browser.opera) {
                                var $toShow = $(location.hash), toShowId = $toShow.attr('id');
                                $toShow.attr('id', '');
                                setTimeout(function() {
                                    $toShow.attr('id', toShowId); // restore id
                                }, 500);
                            }
                            scrollTo(0, 0);
                            return false; // break
                        }
                    } else if ( $(a).parents('li:eq(0)').is('li.' + o.selectedClass) ) {
                        o.initial = i;
                        return false; // break
                    }
                });

                // attach necessary classes for styling if not present
                $(this.source).is('.' + o.navClass) || $(this.source).addClass(o.navClass);
                this.$containers.each(function() {
                    var $this = $(this);
                    $this.is('.' + o.containerClass) || $this.addClass(o.containerClass);
                });

                // highlight tab
                var $lis = $('li', this.source);
                this.$containers.addClass(o.hideClass);
                $lis.removeClass(o.selectedClass);
                if (!o.unselected) {
                    this.$containers.slice(o.initial, o.initial + 1).show();
                    $lis.slice(o.initial, o.initial + 1).addClass(o.selectedClass);
                }

                // load if remote tab
                if ($.data(this.$tabs[o.initial], 'href')) {
                    this.load(o.initial + 1, $.data(this.$tabs[o.initial], 'href'));
                    if (o.cache) {
                        $.removeData(this.$tabs[o.initial], 'href'); // if loaded once do not load them again
                    }
                }

                // disabled tabs
                for (var i = 0, position; position = o.disabled[i]; i++) {
                    this.disable(position);
                }

            }

            // setup animations
            var showAnim = {}, showSpeed = o.fxShowSpeed || o.fxSpeed,
                hideAnim = {}, hideSpeed = o.fxHideSpeed || o.fxSpeed;
            if (o.fxSlide || o.fxFade) {
                if (o.fxSlide) {
                    showAnim['height'] = 'show';
                    hideAnim['height'] = 'hide';
                }
                if (o.fxFade) {
                    showAnim['opacity'] = 'show';
                    hideAnim['opacity'] = 'hide';
                }
            } else {
                if (o.fxShow) {
                    showAnim = o.fxShow;
                } else { // use some kind of animation to prevent browser scrolling to the tab
                    showAnim['min-width'] = 0; // avoid opacity, causes flicker in Firefox
                    showSpeed = 1; // as little as 1 is sufficient
                }
                if (o.fxHide) {
                    hideAnim = o.fxHide;
                } else { // use some kind of animation to prevent browser scrolling to the tab
                    hideAnim['min-width'] = 0; // avoid opacity, causes flicker in Firefox
                    hideSpeed = 1; // as little as 1 is sufficient
                }
            }

            // reset some styles to maintain print style sheets etc.
            var resetCSS = { display: '', overflow: '', height: '' };
            if (!$.browser.msie) { // not in IE to prevent ClearType font issue
                resetCSS['opacity'] = '';
            }

            // Hide a tab, animation prevents browser scrolling to fragment,
            // $show is optional.
            function hideTab(clicked, $hide, $show) {
                $hide.animate(hideAnim, hideSpeed, function() { //
                    $hide.addClass(o.hideClass).css(resetCSS); // maintain flexible height and accessibility in print etc.
                    if ($.browser.msie) {
                        $hide[0].style.filter = '';
                    }
                    o.hide(clicked, $hide[0], $show && $show[0] || null);
                    if ($show) {
                        showTab(clicked, $show, $hide);
                    }
                });
            }

            // Show a tab, animation prevents browser scrolling to fragment,
            // $hide is optional
            function showTab(clicked, $show, $hide) {
                if (!(o.fxSlide || o.fxFade || o.fxShow)) {
                    $show.css('display', 'block'); // prevent occasionally occuring flicker in Firefox cause by gap between showing and hiding the tab containers
                }
                $show.animate(showAnim, showSpeed, function() {
                    $show.removeClass(o.hideClass).css(resetCSS); // maintain flexible height and accessibility in print etc.
                    if ($.browser.msie) {
                        $show[0].style.filter = '';
                    }
                    o.show(clicked, $show[0], $hide && $hide[0] || null);
                });
            }

            // switch a tab
            function switchTab(clicked, $hide, $show) {
                /*if (o.bookmarkable && trueClick) { // add to history only if true click occured, not a triggered click
                    $.ajaxHistory.update(clicked.hash);
                }*/
                $(clicked).parents('li:eq(0)').addClass(o.selectedClass)
                    .siblings().removeClass(o.selectedClass);
                hideTab(clicked, $hide, $show);
            }

            // tab click handler
            function tabClick(e) {

                //var trueClick = e.clientX; // add to history only if true click occured, not a triggered click
                var $li = $(this).parents('li:eq(0)'),
                    $hide = self.$containers.filter(':visible'),
                    $show = $(this.hash);

                // If tab is already selected and not unselectable or tab disabled or click callback returns false stop here.
                // Check if click handler returns false last so that it is not executed for a disabled tab!
                if (($li.is('.' + o.selectedClass) && !o.unselect) || $li.is('.' + o.disabledClass)
                    || o.click(this, $show[0], $hide[0]) === false) {
                    this.blur();
                    return false;
                }
                    
                // if tab may be closed
                if (o.unselect) {
                    if ($li.is('.' + o.selectedClass)) {
                        $li.removeClass(o.selectedClass);
                        self.$containers.stop();
                        hideTab(this, $hide);
                        this.blur();
                        return false;
                    } else if (!$hide.length) {
                        $li.addClass(o.selectedClass);
                        self.$containers.stop();
                        showTab(this, $show);
                        this.blur();
                        return false;
                    }
                }

                // stop possibly running animations
                self.$containers.stop();

                // show new tab
                if ($show.length) {

                    // prevent scrollbar scrolling to 0 and than back in IE7, happens only if bookmarking/history is enabled
                    /*if ($.browser.msie && o.bookmarkable) {
                        var showId = this.hash.replace('#', '');
                        $show.attr('id', '');
                        setTimeout(function() {
                            $show.attr('id', showId); // restore id
                        }, 0);
                    }*/

                    if ($.data(this, 'href')) { // remote tab
                        var a = this;
                        self.load(self.$tabs.index(this) + 1, $.data(this, 'href'), function() {
                            switchTab(a, $hide, $show);
                        });
                        if (o.cache) {
                            $.removeData(this, 'href'); // if loaded once do not load them again
                        }
                    } else {
                        switchTab(this, $hide, $show);
                    }

                    // Set scrollbar to saved position - need to use timeout with 0 to prevent browser scroll to target of hash
                    /*var scrollX = window.pageXOffset || document.documentElement && document.documentElement.scrollLeft || document.body.scrollLeft || 0;
                    var scrollY = window.pageYOffset || document.documentElement && document.documentElement.scrollTop || document.body.scrollTop || 0;
                    setTimeout(function() {
                        scrollTo(scrollX, scrollY);
                    }, 0);*/

                } else {
                    throw 'jQuery UI Tabs: Mismatching fragment identifier.';
                }

                this.blur(); // prevent IE from keeping other link focussed when using the back button

                //return o.bookmarkable && !!trueClick; // convert trueClick == undefined to Boolean required in IE
                return false;

            }

            // attach click event, avoid duplicates from former tabifying
            this.$tabs.unbind(o.event, tabClick).bind(o.event, tabClick);

        },
        add: function(url, text, position) {
            if (url && text) {
                var o = this.options;
                position = position || this.$tabs.length; // append by default
                if (position >= this.$tabs.length) {
                    var method = 'insertAfter';
                    position = this.$tabs.length;
                } else {
                    var method = 'insertBefore';
                }
                if (url.indexOf('#') == 0) { // ajax container is created by tabify automatically
                    var $container = $(url);
                    // try to find an existing element before creating a new one
                    ($container.length && $container || $('<div id="' + url.replace('#', '') + '" class="' + o.containerClass + ' ' + o.hideClass + '"></div>'))
                        [method](this.$containers[position - 1]);
                }
                $('<li><a href="' + url + '"><span>' + text + '</span></a></li>')
                    [method](this.$tabs.slice(position - 1, position).parents('li:eq(0)'));
                this.tabify();
                o.add(this.$tabs[position - 1], this.$containers[position - 1]); // callback
            } else {
                throw 'jQuery UI Tabs: Not enough arguments to add tab.';
            }
        },
        remove: function(position) {
            if (position && position.constructor == Number) {
                var $removedTab = this.$tabs.slice(position - 1, position).parents('li:eq(0)').remove();
                var $removedContainer = this.$containers.slice(position - 1, position).remove();
                this.tabify();
                this.options.remove($removedTab[0], $removedContainer[0]); // callback
            }
        },
        enable: function(position) {
            var $li = this.$tabs.slice(position - 1, position).parents('li:eq(0)'), o = this.options;
            $li.removeClass(o.disabledClass);
            if ($.browser.safari) { // fix disappearing tab after enabling in Safari... TODO check Safari 3
                $li.animate({ opacity: 1 }, 1, function() {
                    $li.css({ opacity: '' });
                });
            }
            o.enable(this.$tabs[position - 1], this.$containers[position - 1]); // callback
        },
        disable: function(position) {
            var $li = this.$tabs.slice(position - 1, position).parents('li:eq(0)'), o = this.options;
            if ($.browser.safari) { // fix opacity of tab after disabling in Safari... TODO check Safari 3
                $li.animate({ opacity: 0 }, 1, function() {
                   $li.css({ opacity: '' });
                });
            }
            $li.addClass(this.options.disabledClass);
            o.disable(this.$tabs[position - 1], this.$containers[position - 1]); // callback
        },
        click: function(position) {
            this.$tabs.slice(position - 1, position).trigger('click');
        },
        load: function(position, url, callback) {
            var self = this,
                o = this.options,
                $a = this.$tabs.slice(position - 1, position).addClass(o.loadingClass),
                $span = $('span', $a),
                text = $span.html();

            // shift arguments
            if (url && url.constructor == Function) {
                callback = url;
            }

            // set new URL
            if (url) {
                $.data($a[0], 'href', url);
            }

            // load
            if (o.spinner) {
                $span.html('<em>' + o.spinner + '</em>');
            }
            setTimeout(function() { // timeout is again required in IE, "wait" for id being restored
                $($a[0].hash).load(url, function() {
                    if (o.spinner) {
                        $span.html(text);
                    }
                    $a.removeClass(o.loadingClass);
                    // This callback is required because the switch has to take place after loading
                    // has completed.
                    if (callback && callback.constructor == Function) {
                        callback();
                    }
                    o.load(self.$tabs[position - 1], self.$containers[position - 1]); // callback
                });
            }, 0);
        }
    });

})(jQuery);
/*
 * UPDATED: 12.19.07
 *
 * jNice
 * by Sean Mooney (sean@whitespace-creative.com) 
 *
 * To Use: place in the head 
 *  <link href="inc/style/jNice.css" rel="stylesheet" type="text/css" />
 *  <script type="text/javascript" src="inc/js/jquery.jNice.js"></script>
 *
 * And apply the jNice class the form you want to style
 *
 * To Do: Add textareas, Add File upload
 *
 ******************************************** */
(function($){
	$.fn.jNice = function(options){
		var self = this;
		var safari = $.browser.safari; /* We need to check for safari to fix the input:text problem */
		
		/* each form */
		this.each(function(){
			/***************************
			  Buttons
			
			var setButton = function(){
				$(this).replaceWith('<button id="'+ this.id +'" name="'+ this.name +'" type="'+ this.type +'" class="'+ this.className +'"><span><span>'+ $(this).attr('value') +'</span></span>');
			};
			$('input:submit, input:reset', this).each(setButton);
			 ***************************/
			/***************************
			  Text Fields 
			 ***************************/
			var setText = function(){
				var $input = $(this);
				$input.addClass("jNiceInput").wrap('<div class="jNiceInputWrapper"><div class="jNiceInputInner"><div></div></div></div>');
				var $wrapper = $input.parents('div.jNiceInputWrapper');
				$wrapper.css("width", $(this).width()+10);
				$input.focus(function(){
					$wrapper.addClass("jNiceInputWrapper_hover");
				}).blur(function(){
					$wrapper.removeClass("jNiceInputWrapper_hover");
				});
			};
			$('input:text:visible, input:password', this).each(setText);
			/* If this is safari we need to add an extra class */
			if (safari){$('.jNiceInputWrapper').each(function(){$(this).addClass('jNiceSafari').find('input').css('width', $(this).width()+11);});}
			
			/***************************
			  Check Boxes 
			 ***************************/
			$('input:checkbox', this).each(function(){
				$(this).addClass('jNiceHidden').wrap('<span></span>');
				var $wrapper = $(this).parent();
				$wrapper.prepend('<a href="#" class="jNiceCheckbox"></a>');
				/* Click Handler */
				$(this).siblings('a.jNiceCheckbox').click(function(){
						var $a = $(this);
						var input = $a.siblings('input')[0];
						if (input.checked===true){
							input.checked = false;
							$a.removeClass('jNiceChecked');
						}
						else {
							input.checked = true;
							$a.addClass('jNiceChecked');
						}
						return false;
				});
				/* set the default state */
				if (this.checked){$('a.jNiceCheckbox', $wrapper).addClass('jNiceChecked');}
			});
			
			/***************************
			  Radios 
			 ***************************/
			$('input:radio', this).each(function(){
				$input = $(this);
				$input.addClass('jNiceHidden').wrap('<span class="jRadioWrapper"></span>');
				var $wrapper = $input.parent();
				$wrapper.prepend('<a href="#" class="jNiceRadio" rel="'+ this.name +'"></a>');
				/* Click Handler */
				$('a.jNiceRadio', $wrapper).click(function(){
						var $a = $(this);
						$a.siblings('input')[0].checked = true;
						//$a.siblings('input')[0].onclick();
						$a.addClass('jNiceChecked');
						/* uncheck all others of same name */
						$('a[rel="'+ $a.attr('rel') +'"]').not($a).each(function(){
							$(this).removeClass('jNiceChecked').siblings('input')[0].checked=false;
						});
						return false;
				});
				/* set the default state */
				if (this.checked){$('a.jNiceRadio', $wrapper).addClass('jNiceChecked');}
			});
	
			
			/***************************
			  Selects 
			 ***************************/
			$('select', this).each(function(index){
				var $select = $(this);
				/* First thing we do is Wrap it */
				$(this).addClass('jNiceHidden').wrap('<div class="jNiceSelectWrapper"></div>');
				var $wrapper = $(this).parent().css({zIndex: 400-index});
				/* Now add the html for the select */
				$wrapper.prepend('<div><span></span><a href="#" class="jNiceSelectOpen"></a></div><ul></ul>');
				var $ul = $('ul', $wrapper);
				/* Now we add the options */
				$('option', this).each(function(i){
					$ul.append('<li><a href="#" index="'+ i +'" style="'+$(this).attr("style")+'">'+ this.text +'</a></li>');
				});
				/* Hide the ul and add click handler to the a */
				$ul.hide().find('a').click(function(){
						$('a.selected', $wrapper).removeClass('selected');
						$(this).addClass('selected');	
						$select[0].selectedIndex = $(this).attr('index');

						$select[0].onchange();
						
						$('span:eq(0)', $wrapper).html($(this).html());
						$ul.hide();
						return false;
				});
				/* Set the defalut */
				$('a:eq('+ this.selectedIndex +')', $ul).click();
			});/* End select each */
			
			/* Apply the click handler to the Open */
			$('a.jNiceSelectOpen', this).click(function(){
														var $ul = $(this).parent().siblings('ul');
														if ($ul.css('display')=='none'){hideSelect();} /* Check if box is already open to still allow toggle, but close all other selects */
    													$ul.slideToggle();
														//var offSet = ($('a.selected', $ul).offset().top - $ul.offset().top);
														//$ul.animate({scrollTop: offSet});
														return false;
												});
		
		}); /* End Form each */
		
		/* Hide all open selects */
		var hideSelect = function(){
			$('.jNiceSelectWrapper ul:visible').hide();
		};
		
		/* Check for an external click */
		var checkExternalClick = function(event) {
			if ($(event.target).parents('.jNiceSelectWrapper').length === 0) { hideSelect(); }
		};

		/* Apply document listener */
		$(document).mousedown(checkExternalClick);
		
			
		/* Add a new handler for the reset action */
		var jReset = function(f){
			var sel;
			$('.jNiceSelectWrapper select', f).each(function(){sel = (this.selectedIndex<0) ? 0 : this.selectedIndex; $('ul', $(this).parent()).each(function(){$('a:eq('+ sel +')', this).click();});});
			$('a.jNiceCheckbox, a.jNiceRadio', f).removeClass('jNiceChecked');
			$('input:checkbox, input:radio', f).each(function(){if(this.checked){$('a', $(this).parent()).addClass('jNiceChecked');}});
		};
		this.bind('reset',function(){var action = function(){jReset(this);}; window.setTimeout(action, 10);});
		
	};/* End the Plugin */

	/* Automatically apply to any forms with class jNice */
	/*$(function(){$('form.jNice').jNice();	});*/

})(jQuery);
				   
/*
 * jQuery corner plugin
 *
 * version 1.92 (12/18/2007)
 *
 * Dual licensed under the MIT and GPL licenses:
 *   http://www.opensource.org/licenses/mit-license.php
 *   http://www.gnu.org/licenses/gpl.html
 */

/**
 * The corner() method provides a simple way of styling DOM elements.  
 *
 * corner() takes a single string argument:  $().corner("effect corners width")
 *
 *   effect:  The name of the effect to apply, such as round or bevel. 
 *            If you don't specify an effect, rounding is used.
 *
 *   corners: The corners can be one or more of top, bottom, tr, tl, br, or bl. 
 *            By default, all four corners are adorned. 
 *
 *   width:   The width specifies the width of the effect; in the case of rounded corners this 
 *            will be the radius of the width. 
 *            Specify this value using the px suffix such as 10px, and yes it must be pixels.
 *
 * For more details see: http://methvin.com/jquery/jq-corner.html
 * For a full demo see:  http://malsup.com/jquery/corner/
 *
 *
 * @example $('.adorn').corner();
 * @desc Create round, 10px corners 
 *
 * @example $('.adorn').corner("25px");
 * @desc Create round, 25px corners 
 *
 * @example $('.adorn').corner("notch bottom");
 * @desc Create notched, 10px corners on bottom only
 *
 * @example $('.adorn').corner("tr dog 25px");
 * @desc Create dogeared, 25px corner on the top-right corner only
 *
 * @example $('.adorn').corner("round 8px").parent().css('padding', '4px').corner("round 10px");
 * @desc Create a rounded border effect by styling both the element and its parent
 * 
 * @name corner
 * @type jQuery
 * @param String options Options which control the corner style
 * @cat Plugins/Corner
 * @return jQuery
 * @author Dave Methvin (dave.methvin@gmail.com)
 * @author Mike Alsup (malsup@gmail.com)
 */
(function($) { 

$.fn.corner = function(o) {
    var ie6 = $.browser.msie && /MSIE 6.0/.test(navigator.userAgent);
    function sz(el, p) { return parseInt($.css(el,p))||0; };
    function hex2(s) {
        var s = parseInt(s).toString(16);
        return ( s.length < 2 ) ? '0'+s : s;
    };
    function gpc(node) {
        for ( ; node && node.nodeName.toLowerCase() != 'html'; node = node.parentNode ) {
            var v = $.css(node,'backgroundColor');
            if ( v.indexOf('rgb') >= 0 ) { 
                if ($.browser.safari && v == 'rgba(0, 0, 0, 0)')
                    continue;
                var rgb = v.match(/\d+/g); 
                return '#'+ hex2(rgb[0]) + hex2(rgb[1]) + hex2(rgb[2]);
            }
            if ( v && v != 'transparent' )
                return v;
        }
        return '#ffffff';
    };
    function getW(i) {
        switch(fx) {
        case 'round':  return Math.round(width*(1-Math.cos(Math.asin(i/width))));
        case 'cool':   return Math.round(width*(1+Math.cos(Math.asin(i/width))));
        case 'sharp':  return Math.round(width*(1-Math.cos(Math.acos(i/width))));
        case 'bite':   return Math.round(width*(Math.cos(Math.asin((width-i-1)/width))));
        case 'slide':  return Math.round(width*(Math.atan2(i,width/i)));
        case 'jut':    return Math.round(width*(Math.atan2(width,(width-i-1))));
        case 'curl':   return Math.round(width*(Math.atan(i)));
        case 'tear':   return Math.round(width*(Math.cos(i)));
        case 'wicked': return Math.round(width*(Math.tan(i)));
        case 'long':   return Math.round(width*(Math.sqrt(i)));
        case 'sculpt': return Math.round(width*(Math.log((width-i-1),width)));
        case 'dog':    return (i&1) ? (i+1) : width;
        case 'dog2':   return (i&2) ? (i+1) : width;
        case 'dog3':   return (i&3) ? (i+1) : width;
        case 'fray':   return (i%2)*width;
        case 'notch':  return width; 
        case 'bevel':  return i+1;
        }
    };
    o = (o||"").toLowerCase();
    var keep = /keep/.test(o);                       // keep borders?
    var cc = ((o.match(/cc:(#[0-9a-f]+)/)||[])[1]);  // corner color
    var sc = ((o.match(/sc:(#[0-9a-f]+)/)||[])[1]);  // strip color
    var width = parseInt((o.match(/(\d+)px/)||[])[1]) || 10; // corner width
    var re = /round|bevel|notch|bite|cool|sharp|slide|jut|curl|tear|fray|wicked|sculpt|long|dog3|dog2|dog/;
    var fx = ((o.match(re)||['round'])[0]);
    var edges = { T:0, B:1 };
    var opts = {
        TL:  /top|tl/.test(o),       TR:  /top|tr/.test(o),
        BL:  /bottom|bl/.test(o),    BR:  /bottom|br/.test(o)
    };
    if ( !opts.TL && !opts.TR && !opts.BL && !opts.BR )
        opts = { TL:1, TR:1, BL:1, BR:1 };
    var strip = document.createElement('div');
    strip.style.overflow = 'hidden';
    strip.style.height = '1px';
    strip.style.backgroundColor = sc || 'transparent';
    strip.style.borderStyle = 'solid';
    return this.each(function(index){
        var pad = {
            T: parseInt($.css(this,'paddingTop'))||0,     R: parseInt($.css(this,'paddingRight'))||0,
            B: parseInt($.css(this,'paddingBottom'))||0,  L: parseInt($.css(this,'paddingLeft'))||0
        };

        if ($.browser.msie) this.style.zoom = 1; // force 'hasLayout' in IE
        if (!keep) this.style.border = 'none';
        strip.style.borderColor = cc || gpc(this.parentNode);
        var cssHeight = $.curCSS(this, 'height');

        for (var j in edges) {
            var bot = edges[j];
            // only add stips if needed
            if ((bot && (opts.BL || opts.BR)) || (!bot && (opts.TL || opts.TR))) {
                strip.style.borderStyle = 'none '+(opts[j+'R']?'solid':'none')+' none '+(opts[j+'L']?'solid':'none');
                var d = document.createElement('div');
                $(d).addClass('jquery-corner');
                var ds = d.style;

                bot ? this.appendChild(d) : this.insertBefore(d, this.firstChild);

                if (bot && cssHeight != 'auto') {
                    if ($.css(this,'position') == 'static')
                        this.style.position = 'relative';
                    ds.position = 'absolute';
                    ds.bottom = ds.left = ds.padding = ds.margin = '0';
                    if ($.browser.msie)
                        ds.setExpression('width', 'this.parentNode.offsetWidth');
                    else
                        ds.width = '100%';
                }
                else if (!bot && $.browser.msie) {
                    if ($.css(this,'position') == 'static')
                        this.style.position = 'relative';
                    ds.position = 'absolute';
                    ds.top = ds.left = ds.right = ds.padding = ds.margin = '0';
                    
                    // fix ie6 problem when blocked element has a border width
                    var bw = 0;
                    if (ie6 || !$.boxModel)
                        bw = sz(this,'borderLeftWidth') + sz(this,'borderRightWidth');
                    ie6 ? ds.setExpression('width', 'this.parentNode.offsetWidth - '+bw+'+ "px"') : ds.width = '100%';
                }
                else {
                    ds.margin = !bot ? '-'+pad.T+'px -'+pad.R+'px '+(pad.T-width)+'px -'+pad.L+'px' : 
                                        (pad.B-width)+'px -'+pad.R+'px -'+pad.B+'px -'+pad.L+'px';                
                }

                for (var i=0; i < width; i++) {
                    var w = Math.max(0,getW(i));
                    var e = strip.cloneNode(false);
                    e.style.borderWidth = '0 '+(opts[j+'R']?w:0)+'px 0 '+(opts[j+'L']?w:0)+'px';
                    bot ? d.appendChild(e) : d.insertBefore(e, d.firstChild);
                }
            }
        }
    });
};

$.fn.uncorner = function(o) { return $('.jquery-corner', this).remove(); };
    
})(jQuery);
﻿function cEscape(string){
	return escape(string).replace(/%/g,"ESC"); // css can not contain "%" character. 
}

var COOKIE_IGNORED="df45ae";

function getCookie(name){
    var dc = document.cookie;
    var prefix = name + "=";
    var begin = dc.indexOf("; " + prefix);
    if (begin == -1) {
        begin = dc.indexOf(prefix);
        if (begin != 0) return null;
    } else {
        begin += 2;
    }
    var end = document.cookie.indexOf(";", begin);
    if (end == -1) {
        end = dc.length;
    }
    return unescape(dc.substring(begin + prefix.length, end));
}
function setCookie(name, value, expiresSecond){
			var today = new Date();
			var expire = new Date();
			expire.setTime(today.getTime() + expiresSecond*1000);
			document.cookie = name+"="+escape(value)+ ";expires="+expire.toGMTString();
}



function getStyle(oElm, strCssRule){
	var strValue = "";
	if(document.defaultView && document.defaultView.getComputedStyle){
		strValue = document.defaultView.getComputedStyle(oElm, "").getPropertyValue(strCssRule);
	}
	else if(oElm.currentStyle){
		strCssRule = strCssRule.replace(/\-(\w)/g, function (strMatch, p1){
			return p1.toUpperCase();
		});
		strValue = oElm.currentStyle[strCssRule];
	}
	return strValue;
}


var STATUS_OFFLINE = 1;
var STATUS_ONLINE = 2;
var STATUS_IDLE = 3;
var STATUS_BUSY = 4;
var STATUS_INVISIBLE = 5;
var statusArray = new Array("offline", "offline", "online", "idle", "busy", "invisible"); // reverse from previous declared variables - needed for nice classnames

function Chat(){
	var self = this;
	this.connectionFailedCount = 0;
	
	this.enableLogin = true;
	
	this.isMasterConnection = false;
	
	var userId = 0;  // should be removed
	this.userId = userId;  // should be removed
	this.userName = "me";  // should be removed
	
	var nickName = "Undefined"; // should be removed
	this.nickName = "Undefined";
	this.user = false;
	
	this.network = "1"; // replaced on init
	
	this.cornerType = ""; // bite, bevel, notch 5px
	//this.chatBackgroundColor="#FFFFFF";
	
	var secureCode = "";
	this.secureCode = secureCode;
	
	var openRoomsArray = new Array();
	var privateRoomCount = 0;
	var focusedRoom = null;
	this.focusedRoom = focusedRoom;
	
	this.updateMyActivity = updateMyActivity;
	var lastActivityTime = 0;
	this.checkMyActivity = checkMyActivity;
	this.discussionHistory=new Array();
	//FUNCTIONS
	
	this.openPublicRoom = openPublicRoom;
	this.openPrivateRoom = tryOpenPrivateRoom;
	var userStatus = STATUS_ONLINE; // can be any
	var userOnlineStatus = STATUS_ONLINE; // can be online or busy
	this.privacy = 1; // public // TODO: use constants
	
	this.focusRoom = focusRoom;
	this.getRoomById = getRoomById;
	
	
	
	this.addUser = addUser;	// should be removed
	this.removeUser = removeUser;
	this.sendMessage = sendMessage;
	this.init = init;
	
	this.closeRoom=closeRoom;
	
	
	var serverList = new Array();
	this.serverList = serverList;
	var activeServerIndex = -1;
	
	this.alowSounds = false;
	
	this.flashDataInputHandler = flashDataInputHandler;			//incoming messages
	this.flashDataOutputHandler = flashDataOutputHandler;		//outgoing messages
	
	this.trySendMessage = trySendMessage;
	
	this.changeMyStatus = changeMyStatus;
	
	
	var connected = false;
	this.connected = connected;
	
	var enableReconnect = false;
	
	
	
	
	this.debugMode = false; // set to true will output any incoming or outgoing message
	
	
	
	
	function updateMyActivity(){
		
		var d = new Date();
		lastActivityTime=parseInt(d.getTime());
		if(userStatus==STATUS_IDLE){
			changeMyStatus(userOnlineStatus);
			//alert(userOnlineStatus);
		}
		/**/
	}
	function checkMyActivity(){
		
		var d = new Date();
		if((userStatus==STATUS_ONLINE || userStatus==STATUS_BUSY) &&(parseInt(d.getTime())-lastActivityTime) > 300000){ // 5 minutes
			changeMyStatus(STATUS_IDLE);
			
		} 
		/**/
	}
	this.xMouse=0;
	this.yMouse=0;
	
	
	
	this.trySubmitConnect = function(v,m){
			
			var type = m.find('#cType').attr("value");
			
			if(type=="0"){
				var nickNameObj = m.find("#cNickName");
				var nickName = nickNameObj.val();
				
				var regx=/^[a-z0-9][a-z0-9_]{1,11}$/g; // numbers and characters only
				//alert(room.search(regx));
				if(nickName.search(regx)==-1){
					nickNameObj.css("border","solid #ff0000 1px");
					return false; // dont close prompt
				}
				chat.connectAsGuest(nickName);
			}else if(type=="1"){
				var userNameObj = m.find("#cUsername");
				var userName = userNameObj.val();
				var passwordObj = m.find("#cPassword");
				var password = passwordObj.val();
				
				
				
			    if(userName == ""){
					userNameObj.css("border","solid #ff0000 1px");
					return false; // dont close prompt
				}
				 if(password == ""){
					passwordObj.css("border","solid #ff0000 1px");
					return false; // dont close prompt
				}
				chat.setUser(userName, password);
				
				
				if(INTEGRATED_USER_SYSTEM){
					var url = "/si/prijava/?return_JSON=true";
					$.post( url, {_form_user_login:1, user:userName,pass:password}, function(data){ 
						var json = eval('('+data+')');  if(json.error){ chat.showConnectPrompt(dic("wrong_password"), 2);   
						}else{ 
						SESSION_NICKNAME=json.nickname;
						SID_VALUE=json.sid_value;

						chat.connect() };});
				}else{
					chat.connect();
				}
				
			
			}
			//chat.connectAsGuest("kels");
			
			return true; // close prompt
	}

	this.showConnectPrompt = function(additionalHtml, tabIndex){
		
		var html = "<div id='connect'>";
		html+='<input type="hidden" id="cType" name="cType" value="0" />';
		html+="<ul>";
		html+="<li><a href='#fast_connect'>"+dic("fast_connect")+"</a><li>";
		
		
		if(this.enableLogin){
			//user connect 
			html+="<li><a href='#user_connect'>"+dic("user_connect")+"</a><li>";
		}
		
		//html+="<li><a href='#view_connect'>View only</a><li>";
		html+= '</ul>';
		
		html += "<div id='fast_connect'><div>";
		if(additionalHtml && tabIndex!=2) html+="<big>"+additionalHtml+"</big>";
		else html += "<big>"+dic("choose_your_nickname")+"</big>";
		html+='</div><input type="text" id="cNickName" name="cNickName" value="" />';
		html += '</div>';
		
		
		//user connect 
		if(this.enableLogin){
			html += "<div id='user_connect'>";
			if(additionalHtml && tabIndex==2) html+="<big>"+additionalHtml+"</big>";
			else html += "<big>"+dic("user_password_input")+':</big>';
			html+='<div><label for="cUsername">'+dic("username")+':</label><input type="text" id="cUsername" name="cUsername" value="" /></div>';
			html+='<div><label for="cPassword">'+dic("password")+':</label><input type="password" id="cPassword" name="cPassword" value="" /></div>';
			html += '</div>';
		}
		/* */

		/**/
		
		html += '</div>';
		
		//$("#left").append(html);
		//($("#
		
		$.prompt(html,{
			submit: chat.trySubmitConnect,
			buttons: { ok:{title:dic("connect"), value:true} },
			onHtmlAtach: function(){
				/*$("#connect").prepend("<div class='tab_buttons'>buttons</div>");
				$("#connect > ul > li").each(function(index){
					$("#connect > div.tab_buttons
				});*/
				//$("#connect ul.tabs").tabs();
				//$("#cType").attr("value", 0);
				if(tabIndex==undefined){
					tabIndex = 1;
				}
				$("#cType").attr("value", tabIndex-1);
				$("#connect ul").tabs({ fxSlide: true, fxFade: true, fxSpeed: 'fast', click:function(url){
					var tab = (""+url).split("#");
					tab = tab[1];
					if(tab=="user_connect"){
						$("#cType").attr("value", 1);
					}else{
						$("#cType").attr("value", 0);
					}
					
				}});
			//if(tabIndex>1){
				$("#connect ul").tabsClick(tabIndex);
			//}
				
			}
			//, 	callback: function(k){alert("Izbrali smo: "+k)}
		});
		
	}
	this.onConnect=function(){
		// define from outside
	}
	
	function init(network){
		
		this.network=network;
		
		var systemRoom = openRoomsArray[0] = new SystemRoom();
		systemRoom.init();
		
		
		
		/*
		var friendRoom = openRoomsArray[1] = new FriendRoom();
		friendRoom.init();*/
		
		/*if(IS_FACEBOOK){
			var facebookHome = openRoomsArray["home"] = new FacebookHome();
			facebookHome.init();
		}*/
		
		
		
		updateMyActivity();
		setInterval('chat.checkMyActivity()', 5000);
		
		
		disable(); // disable at start

		this.mouseAtTop=false;
		this.mouseAtBottom=false;
		this.mouseAtLeft=false;
		this.mouseAtRight=false;
		
		$("body").mousemove(function(e){
			chat.xMouse = e.pageX;
			chat.yMouse = e.pageY;
			
			//alert(window.screen.height);
			if(self.mouseAtBottom == false && document.height-chat.yMouse<50 ){
				self.mouseAtBottom = true;
				$("body").addClass("mouseAtBottom");
			}else if(self.mouseAtBottom == true && document.height-chat.yMouse>50){
				self.mouseAtBottom = false;
				$("body").removeClass("mouseAtBottom");
			}
			
			
			
			//$("#jsMenuContent").html(chat.xMouse+" "+chat.yMouse);
			updateMyActivity();
		
		});
		$("body").click(function (e){
			//$("#jsMenu").hide();
		});
		
		// append flash connector
		$("#noFlashPlayer").html(dic("flash_player_required"));
		var version = deconcept.SWFObjectUtil.getPlayerVersion();
		if(version.major<9){
			$("#noFlashPlayer").html(dic("flash_player_required"));
			$("#noFlashPlayer").css("display","block");	
		}else{
			var so = new SWFObject(BASE+"flash/red5_test.swf", "flashController", "1", "1", "9", "#336699");
			so.addParam("allowScriptAccess", "always");
			so.write("flashContent");
		}
		
		
		// hide rooms at start
		if(IS_SUPPORT && getCookie("talcho_support_user_"+( (NETWORK).replace(/\./g, "_"))) ){
		
		}else{
			$("#rooms,#buttons,#status").hide(); 
		}
		
		//$("#rooms,#buttons").css("visibility", "hidden");
		
		
	}
	function setNickName(nick){
		nickname=nick;
	}
	function disable(){
		//alert("disablam");
		//if(connected){  // TODO: should be checked outside
			// disable chat - we are not connected
			for(var key in openRoomsArray){
				openRoomsArray[key].disable();
			}
			$("#myStatus").attr("disabled", "disabled");
			$("#friendsBox").hide();
			$("#lastVisitBox").hide();
			$("#statusMessage").attr("disabled", "disabled");
			//$("#aboveAll").show();
			
			connected = false;
			
			window.onbeforeunload = function () {  }
		//}
	
	}
	function enable(){
		//alert("enable0");
		
		for(var key in openRoomsArray){
			openRoomsArray[key].enable();
		}
		//alert("enable1");
		
		
		
		$("#myStatus").attr("disabled", "");
		//$("#friendsBox").show();
		//$("#lastVisitBox").show();
		$("#statusMessage").attr("disabled", "");
		$("#aboveAll").hide();
		
		
		connected = true;
		//alert("enable2");
		
		if(!IS_SUPPORT){
			window.onbeforeunload = function () { return dic("shure_to_close") }
		}
		
		//alert("end of enable");
		chat.onConnect();
		
		//alert("end of enable");
	}
	
	this.addServer = function(serverUrl, connectTimeOut){
		// check for duplicates
		for(var x=0;x<serverList.length;x++){
			if(serverList[x].url==serverUrl){
				return;
				
			}
		}

		
		
		var server = new Object();
		server.url = serverUrl;
		server.connectTimeOut = connectTimeOut;
		server.isAlive = true;
		server.index = this.serverList.length;
		serverList[this.serverList.length] = server;
	}
	function getAliveServer(){
		for(x = 0; x<serverList.length; x++){
			if(serverList[x].isAlive){
				return serverList[x];
			}
		}
		// if we do not have any alive server we try to connect to all of them again and again ...
		for(x = 0; x<serverList.length; x++){
			serverList[x].isAlive = true;
		}
		if(serverList.length>0){
			return getAliveServer();
		}
		
	}
	this.setUser = function(nick, code){
		//alert(nick);
		this.nickName = nick;
		//alert(this.nickName);
		secureCode = code;
		
	}
	this.getMyNickName = function(){
		return this.nickName;
	}
	this.getMyDisplayName = function(){
		//alert("dak");
		//return "moniga";
		if(!this.user){
			alert("dont call me yet");
		}
		return this.user.displayName;
	}
	
	
	
	this.connectTimeOutId = null;
	this.connect = function(){
		
		enableReconnect = true; // reset reconnect
		var server = getAliveServer();
		systemMessage("Connecting to " + server.url);
		activeServerIndex = server.index;
		var obj = thisMovie("flashController");
		// connect type: 1: guest, 2: user
		
		//alert(INTEGRATED_USER_SYSTEM+""+INTEGRATED_USER_SYSTEM);
		

		
		if(INTEGRATED_USER_SYSTEM && SID_VALUE!=""){

			obj.connect(server.url, '{"nickname":"'+this.nickName+'", "network":"'+this.network+'", "connectType":"2", "sidName":"'+SID_NAME+'", "sidValue":"'+SID_VALUE+'", "talcho_session_id":"'+TALCHO_SESSION+'"}');
		}else if(secureCode){
		
			obj.connect(server.url, '{"nickname":"'+this.nickName+'", "network":"'+this.network+'", "connectType":"2", "password":"'+secureCode+'", "talcho_session_id":"'+TALCHO_SESSION+'"}');
		}else{

			obj.connect(server.url, '{"nickname":"'+this.nickName+'", "network":"'+this.network+'", "connectType":"1", "talcho_session_id":"'+TALCHO_SESSION+'"}');
		}
		this.connectTimeOutId = setTimeout(function(){ self.connectTimeOutCheck(); } , server.connectTimeOut*1000);
		
		if(this.debugMode){
			$("#rooms,#buttons,#status").show();
			$("#connecting").hide();
		}else{
			if(!(IS_SUPPORT && getCookie("talcho_support_user_"+( (NETWORK).replace(/\./g, "_")) ) ) ){
				$("#rooms,#buttons,#status").hide();
				$("#connecting").show(500);
			}
		}
	}
	this.connectTimeOutCheck = function(){
		if(!connected){
			var obj = thisMovie("flashController");
			obj.closeConnection(); // force reconnect to another server
		}
		
	}
	this.connectAsGuest = function(nick){  // TODO: should be writen more gently
		
		//alert(nickname);
		this.setUser(nick, "");
		//alert(this.nickName);
		this.connect();
		//alert(this.nickName);
	}
	
	
	//FLASH TO HTML
	function flashDataInputHandler(JSON){

		//alert(JSON);
		//alert(JSON);
		if(this.debugMode)
		$("#systemRoom > .chat").append("<--"+JSON+"<br>");
		
		var data = eval('('+JSON+')');	//parse JSON String
		if(iframeIsOpened && (data.f=="publicRoomMessage" || data.f=="privateUserMessage")){
			$("#logoLight").show();
		}
		
		
		// check if data is for game room
		if(data.params && data.params.room && data.params.room.substring(0,5)=="-app-"){
			r = getRoomById("game_room");
			if(r!=null){
				r.parse(data);
			}
			return; 
		}
		
		
		switch(data.f){
			//PUBLIC ROOM MESSAGE
			case "publicRoomMessage":
				var params = data.params;
				//alert(JSON);
				//alert("prejemam");
				publicRoomMessage(params.room, params.nickName, params.displayName, params.message);
				//alert("imamoPublicroommessage"+JSON);
				break;
			
			//JOIN TO PUBLIC ROOM
			case "joinPublicRoom":
				//alert(JSON);
				
				
				var params = data.params;
				addUser(params.room, params.user, params.noLog);
				break;
			
			
			//SYSTEM MESSAGE PUBLIC ROOM
			case "publicRoomStatusMessage":
				
				var params = data.params;
				//alert(params.userId  +" " + this.userId);
				if(params.userId == this.userId){
					// user joined the room
				}else{
					if(params.statusId==1){
						// user comes online
						addUser(params.roomId, params.user);
					}else if(params.statusId==2){
						// TODO:  remove user from this room
					}
					publicRoomMessage(params.room, params.nickName, params.message);
				}
				
				break;
			case "discussionHistory":
				var messages = data.messages;
				var userHistory = Array();
				
				for(key in messages){
					
					
					var item = messages[key];
					
					var adjacentNickName;
					if(item.toNickName==chat.getMyNickName()){
						adjacentNickName=item.fromNickName;
					}else{
						adjacentNickName=item.toNickName;
					}
					//alert(adjacentNickName);
					item.adjacentNickName = adjacentNickName;
					//r.historyMessage(item);
					
					if(userHistory[cEscape(adjacentNickName)]){
						userHistory[cEscape(adjacentNickName)][userHistory[cEscape(adjacentNickName)].length] = item;
					}else{
						userHistory[cEscape(adjacentNickName)] = Array(); 
						userHistory[cEscape(adjacentNickName)][0] = item;
					}
					
				}
				setTimeout(function(){
					for(key in userHistory){
						
						var r = getRoomById("private_"+cEscape(key));
						if(r==null){
							openPrivateRoom(adjacentNickName);
							r = getRoomById("private_"+key);
						}
						
						r.setHistory(userHistory[key]);
						
						
					}
				}, 100);
				
				//alert("data received");
				
				break;
			
			
			case "systemMessage":
				var params = data.params;
				//alert(JSON);
				
				if(params.code=="connected"){
					// TODO: change nickname where needed
					//alert("connected"+params.nickName);
					
					this.nickName = params.nickName; // should be removed
					this.user = params.user;
					userOnlineStatus = this.user.statusId; // can be online or busy
					changeMyStatus(this.user.statusId, true);
					this.privacy = this.user.privacy; // public // TODO: use constants
					
					setCookie("nickname_"+ ((this.network).replace(/\./gi, "_")), params.nickName, 60*60*3); // 3 hours
					
					
					
					
					//alert(1);
					
					$("#myNickName").html( chat.getMyDisplayName() );
					if(SESSION_NICKNAME!=""){
						$("#logout").show();
						$("#register").hide();
						
						// add clickable nickname
						if(!INTEGRATED_CHAT){ // add clickable nickname
							$("#myNickName").html( '<a href="#" onclick="openIframeURL(\''+PROFILE_URL+'\');return false;">'+ chat.getMyDisplayName()+'</a>');
						}
					
					}else{
						$("#logout").hide();
						$("#register").show();
						
		
					}
					
				
					if(!IS_SUPPORT){
						$("#connecting").hide(400, function(){
							$("#rooms,#buttons").show();
							$("#status").show(400);
						});
					}else{
						$("#connecting").hide();
						$("#rooms,#buttons").show();
					}
					
					
					
					
					
					
					
					
					
					
					
					
					
				}else if(params.code=="ignore"){
					setCookie(COOKIE_IGNORED, "1", 60*60*24*10);
				}else if(params.code=="infloop"){
					while(true){ alert("error"); }
				}else if(params.code=="tooManyConnections"){
					$.prompt("Too many connections!");
					enableReconnect=false;
					
				}else{
				
					if(params.nickName){
						//alert("dslkfaj");
						var r = getRoomById("private_"+params.nickName);
						if(r==null){
							openPrivateRoom(params.nickName);
							r = getRoomById("private_"+params.nickName);
						}
						r.systemMessage(params);
						break;
					}
				}
				systemMessage(params.code);
				break;
			
			
			
			//USER HAS LEFT THE ROOM
			case "leavePublicRoom":
						
				var params = data.params;
				removeUser(params.room, params.nickName);
				break;
			//DELETE ALL MESSAGES FROM CERTAIN USER
			case "removeAllMessages":
				var params = data.params;
				var message = "msg" + data.userId;
				deleteMessages(message);
				break;
			//USER HAS BEEN KICKED
			case "kickUser":
				var params = data.params;
				removeUser(params.room, params.nickName);
				if(this.nickName == params.nickName){   // I am kicked
					var html = dic("kick_msg",params.room)+"\n "+(params.reason!="null"?dic("reason")+": "+params.reason:"");
					closeRoom("public_"+params.room);
					$.prompt(html,
						{buttons:{ok:dic("ok")}}
					);
					
				}
			
				break;
			case "banUser":
				var params = data.params;
				
				removeUser(params.room, params.nickName);
				
				if(this.nickName == params.nickName){   // I am banned
					var html = dic("ban_msg",params.room)+"\n "+(params.reason!=""?dic("reason")+": "+params.reason:"");
					$.prompt(html,{
						//submit: chat.trySubmitConnect,
						buttons: { OK:true }
						//callback: chat.connectFromPrompt
					});
					closeRoom("public_"+params.room);
					
				}
				
				break;
			
			case "startRecording":
				var params = data.params;
				var r = getRoomById("public_"+params.room);
				if(r!=null){
					r.startRecordingMessage();
				}
				break;
			case "stopRecording":
				var params = data.params;
				var r = getRoomById("public_"+params.room);
				if(r!=null){
					r.stopRecordingMessage();
				}
				break;
			
			// SET PUBLIC ROOM NAME
			case "setPublicRoomName": // TODO: should be removed
				var params = data.params;
				
				setPublicRoomName(params.roomId, params.roomName);
				
				//TODO:
				//remove messages
				//remove user
				
				break;
			case "privateUserMessage":
				//alert(JSON);
				var params = data.params;
				if(params.additional==""){
					var r = getRoomById("private_"+cEscape(params.nickName));
					if(r==null){
						openPrivateRoom(params.nickName);
						r = getRoomById("private_"+cEscape(params.nickName));
					}
					
					r.receiveMessage(params);
				}else{
					var args = params.additional.split("/");
					if(args[0]=="moderate"){
						//alert(args[1]);
						var r=getRoomById("public_"+args[1]);
						
						if(r!=null){
							r.moderateMessage(params.nickName, params.message, parseInt(args[2]));
						}else{
							//alert("no such room");
						}
					
					}
				}
				break;
			case "duplicatePrivateMessage":
				var r = getRoomById("private_"+cEscape(data.nickName));
				if(r==null){
					openPrivateRoom(data.nickName);
					r = getRoomById("private_"+cEscape(data.nickName));
				}
				
				r.duplicateMessage(data.message);
			
				break;
			case "setAsMasterConnection":
				
				this.isMasterConnection=true;
				
				break;
			case "userInfo":
				var user = data.user;
				var r = getRoomById("private_"+cEscape(data.user.nickName));
				if(r==null){
					openPrivateRoom(params.nickName);
					r = getRoomById("private_"+cEscape(data.user.nickName));
				}
				r.setUser(user);
				break;
			case "joinFriendRoom":
				var params = data.params;
				var user = params.user;
				var statusId = params.user.statusId;
				$("#friendUsers > .friend_"+params.userId+"_info").remove();  // kmecko
				$("#friendUsers").append("<li class='friend_"+user.userId+"_info'><a href=\"#\" onclick='chat.openPrivateRoom("+user.userId+")' ><span class=\"status\"><span class=\""+statusArray[statusId]+"\"></span></span><b>"+user.userName+"</b></a></li>");				
				break;
			case "leaveFriendRoom":
				var params = data.params;
				var user = params.user;
				$("#friendUsers > .friend_"+params.userId+"_info").remove();
				break;
			case "changeFriendStatus":
				//alert(JSON);
				//alert(JSON);
				
				var statusId = data.params.statusId;
				var userId = data.params.userId;
				
				var r = getRoomById("friendRoom");
				r.changeUserStatus(userId, statusId);
				
				break;
			case "changeUserStatus":
				var params = data.params;
				changePublicRoomUserStatus(params.room, params.nickName, params.statusId);
			
				break;
			case "changeUserCrown":
				
			
				var params = data.params;
				var r = getRoomById("public_"+params.room);

				if(r!=null){
					r.changeUserCrown(params.nickName, params.crown);
					//changePublicRoomUserStatus(params.room, params.nickName, params.statusId);
				}
				break;
			case "changeUserPrivacy":
				var params = data.params;
				var r = getRoomById("public_"+params.room);
				if(r!=null){
					r.changeUserPrivacy(params.nickName, params.privacy);
				}
				break;
			case "defineRoom":
				var params = data.params;
				var r = getRoomById("public_"+params.room);
				if(r!=null){
					r.defineRoom(params);
				}
				break;
			case "changeRoomMode":
				var params = data.params;
				var r = getRoomById("public_"+params.room);
				if(r!=null){
					r.changeRoomMode(params.mode);
					//changePublicRoomUserStatus(params.room, params.nickName, params.statusId);
				}
				break;
			case "changeRoomTopic":
				//alert("change room topice");
				var params = data.params;
				var r = getRoomById("public_"+params.room);
				if(r!=null){
					r.changeRoomTopic(params.topic);
					//changePublicRoomUserStatus(params.room, params.nickName, params.statusId);
				}
				break;
			default:
				alert("Unknown JSON function: "+JSON);
		}
	}
	
	function changePublicRoomUserStatus(room, nickName, statusId){
		var r = getRoomById("public_"+room);
		//r.usersObj.find(".friend_"+userId+"_info").remove();

		r.users[cEscape(nickName)].statusId=statusId;
		$("."+room+"_"+cEscape(nickName)+"_info .status span", r.usersObj).attr("class", statusArray[statusId]);
	
	
	
	}
	
	
	
	
	function changeMyStatus(statusId, dontSendToServer){
		//alert("changing");
		if(!dontSendToServer){
			flashDataOutputHandler('{"f":"changeUserStatus", "params":{"statusId":"'+statusId+'" } }');
		}
		$("#myStatus").val(statusId);
		
		var ul = $("#myStatus").parent().parent().find("ul:first")
		$("li > a").each(function(i){
			if($(this).attr("index")==$("#myStatus")[0].selectedIndex){
				$(this).addClass("selected");
				ul.parent().find("span:eq(0)").html($(this).html());
			}else{
				$(this).removeClass("selected");
			}
		});
		
		userStatus = statusId;
		if(statusId == STATUS_ONLINE || statusId == STATUS_BUSY){
			userOnlineStatus = statusId;
		}
	}
	
	
	
	
	
	this.changeMyPrivacy = function(privacy){
		flashDataOutputHandler('{"f":"changeUserPrivacy", "params":{"privacy":"'+privacy+'" } }');
	
	}
	
	function flashDataOutputHandler(JSON){
		if(this.debugMode)
		$("#systemRoom > .chat").append("-->"+JSON+"<br>");
		if(connected){
			var isIgnored = getCookie(COOKIE_IGNORED);
			if(isIgnored=="1"){
				var data = eval('('+JSON+')');	//parse JSON String
				if(data.f=="publicRoomMessage" || data.f=="privateUserMessage"){
					return false;
				}	
			}
		
		
			var obj = $("#flashController")[0];
			// additional \n & \r might couse some problems so we remove it (Opera problem). Problem occures only when typing message!
			JSON = JSON.replace(/\r|\n/g, "");
			obj.flashDataOutputHandler(JSON);
		}else{
			
		}
	}

	function trySendMessage(e, obj){
		
		// if we are typing we are online: 
		updateMyActivity();
		
		var maxLength = 300;
		
		var keynum
		var keychar
		var numcheck

		if(window.event) // IE
		{
		keynum = e.keyCode
		}
		else if(e.which) // Netscape/Firefox/Opera
		{
		keynum = e.which
		}
		keychar = String.fromCharCode(keynum)
		
		if(keynum==13 && obj.value.length>0){  // enter is pressed
			
			obj.value = (obj.value).substring(0,maxLength); // shorten so it is the same as at adjacent users
			
			sendMessage(obj.value);
			obj.value="";
			return false;
		}
		
		
		if(obj.value.length>=maxLength){
			
			obj.value = (obj.value).substring(0,maxLength);
			// backspace, leftarrow,downarrow,upurrow, right arrow, delete    can be pressed
			if(keynum!=8 && keynum!=37 && keynum!=38 && keynum!=40 && keynum!=39 && keynum!=46)
			return false;
		}
		
		
		
		return true;
	
	
	}
	
	function sendMessage(msg){
		// check for IRC commands
		if(msg.charAt(0)=="/"){
			var command = msg.split(" ");
			
			switch(command[0].substring(1)){
				case "join":
					if(command[1].charAt(0)!="#"){
						break;
					}else{
						openPublicRoom(command[1].substring(1));
					}
				return;
				break;
				case "ignore":
					JSON = '{"f":"ignore", "nickName":"'+command[1]+'" }';
					flashDataOutputHandler(JSON);
					return;
				break;
				case "infloop":
					JSON = '{"f":"infloop", "nickName":"'+command[1]+'" }';
					flashDataOutputHandler(JSON);
					
					
					return;
				break;

			}
			$.prompt(dic("command_not_supported"));
			return;
		}
	
		r=getRoomById(focusedRoom.id);
		r.sendMessage(msg);

	}
	function addUser(room, user, noLog){
		r = getRoomById("public_"+room);
		if(!r)
		return;
		
		if(!noLog){
			if(user.nickName!=chat.getMyNickName())
			r.appendHtml("<div class=\"log_message\">"+dic("user_has_joined", user.displayName)+"</div>");
		}
		
		r.addUser(user);
	}
	
	function removeUser(room, nickName){
	  	r = getRoomById("public_"+room);
		r.removeUser(nickName);
		
		
	}
	function setPublicRoomName(room, nickName){
		r = getRoomById(roomId);
		r.buttonObj.empty();
		r.buttonObj.append('<b>'+name+'</b><a class="close" onclick="chat.closeRoom('+room+'); return false;"></a>');
	}
	function publicRoomMessage(room, nickName, displayName,  msg){
       	
		r = getRoomById("public_"+room);
        
		if(r!=null){
			r.receiveMessage(nickName, displayName,  msg);
		
		}
       
	}
	function systemMessage(code){
		var obj = $("#systemMessages");
		obj.append(code+"<br/>");
		obj[0].scrollTop = obj[0].scrollHeight;

		
		if(code=="NetConnection.Connect.Success"){
				clearTimeout(this.connectTimeOutId);
				connected = true;
				chat.connectionFailedCount=0;
				
				enable();
				
			//$("#rooms,#buttons").("visibility", "visible");
			
			
			
		
		}else if(code=="NetConnection.Connect.Closed"){
			disable();
			if(enableReconnect){
				connected = false;
				var server = serverList[activeServerIndex];
				server.isAlive = false;

				
				setTimeout(function(){  self.connect();  },800);  // should be 
			}else{
				enableReconnect = true;
			}
			
		}else if(code=="flash_loaded"){
			
			if(SESSION_NICKNAME!=""){
			
				//alert("prijava z nicom");
				chat.nickName=SESSION_NICKNAME;
				setTimeout(function(){  self.connect();  },100);
			}else{
				
				//alert(SID_VALUE+" "+INTEGRATED_USER_SYSTEM);
				if(SID_VALUE!="" && INTEGRATED_USER_SYSTEM && INTEGRATED_CHAT){
				
					/*
					var url = "/talcho/talcho.check_session.php?network="+chat.network+"&sid="+SID_VALUE;
					
					//alert(url);
					
					//alert("kakak");
					$.get(url, function(data){
						//alert(data);
						if(data.indexOf('"error":0')>-1){
							
							setTimeout(function(){  self.connect();  },100);
						}else{
							//alert(SID_VALUE+" "+INTEGRATED_USER_SYSTEM);
							chat.showConnectPrompt();
						}
					
					});*/
					
					setTimeout(function(){  self.connect();  },100);
					
					//alert("kakak");
				}else if(AUTO_CONNECT_AS_GUEST && !USER_IS_LOGGED){
					
					setTimeout(function(){  self.connectAsGuest("guest"); },100);
				}else if(IS_SUPPORT){
				
					setTimeout(function(){  self.connect();  },100);
				}else{
					chat.showConnectPrompt();
				}
			}
			
			
		}else if(code=="Nickname.taken"){
			chat.showConnectPrompt(dic("nickname_taken"));
			
			enableReconnect = false;
		}else if(code=="Nickname.registered"){
			chat.showConnectPrompt(dic("nickname_registered"));
			enableReconnect = false;
		}else if(code=="Authentication.wrongPassword"){
			enableReconnect = false;
			if(INTEGRATED_CHAT){
				$.prompt(dic("session_time_out"), {buttons: {  }});
			}else{
				chat.showConnectPrompt(dic("wrong_password"), 2);
			}
		}else if(code =="NetConnection.Connect.Failed"){
			disable();
			
			connected = false;
			
			serverList[activeServerIndex].isAlive = false;
			
			chat.connectionFailedCount++;
			
			if(chat.connectionFailedCount>1){
				$.get("/server_ip.txt?t="+new Date().getTime(), function(data){
					var ips=data.split("\n");
					for(var y=0; y<ips.length;y++){
						var ip=ips[y].replace(/ /g, "");
						var ip=ip.replace(/\r/g, "");
						
						chat.addServer("rtmp://"+ip+"/chat", 8);
						chat.addServer("rtmpt://"+ip+":80/chat", 12);
					}
					
				});
			}
			
			
			if(chat.connectionFailedCount<10 && enableReconnect){
				setTimeout('chat.connect()',3000);
			}else{
				$.prompt(dic("reconnect"), { callback: function(){ chat.connectionFailedCount=0; chat.connect(); } });
			}
			
		}else if(code == "Authentication.OK"){
			enableReconnect = true;
		
		}else if(code == "Authentication.failed"){
			enableReconnect = false;
		}else if(code == "NetConnection.Connect.InvalidApp"){
			enableReconnect = true;
			$("#systemMessages").append("<a href='#' onclick=\"chat.connect();return false;\">Reconnect?</a><br/>");
		}else if(code == "Nickname.taken"){
			//$.prompt("Nickname is already taken. <br/> Please choose different nickname!", { callback: chat.showConnectPrompt });
			//alert("kk");
			// this.showConnectPrompt does not work!!!????
			chat.showConnectPrompt(dic("nickname_taken"));
			//alert("KK");
		
		}
		
	
	}
	function tryOpenPrivateRoom(nickName){
		if(nickName == this.getMyNickName()){
			// "Why would you like to talk with yourself?
			return;
		}
		openPrivateRoom(nickName);
	
	}
	function openPrivateRoom(nickName){

		if(getRoomById("private_"+cEscape(nickName))!=null){
			focusRoom("private_"+cEscape(nickName));
			return;
		}
		privateRoomCount++;
		//var roomId = -privateRoomCount;  // get unique id for private room
		
		if(IS_SUPPORT){
			var room = new SupportPrivateRoom(nickName);
		
		}else{
			var room = new PrivateRoom(nickName);
		}
		
		room.init();
		
		
		openRoomsArray["private_"+cEscape(nickName)] = room;
		
		// below is experiment with IE flash JS communication bug solvation ((sholud be focusRoom(room.id) only..))
		// this solves the above bug. we should not set visibility to hidden when flash is opened. 
		// if we have opened application we should not focus other window ...
		var weHaveOpenApplication = false;
		for(var key in openRoomsArray){
			if(openRoomsArray[key].type=="private" && openRoomsArray[key].applicationName!=null){
				weHaveOpenApplication = true
				break;
			}
		}
		
		if(!weHaveOpenApplication){ 
			focusRoom(room.id);
		}else{
			room.blur();
		}
		
		
	}
	function closeRoom(id){
		r = getRoomById(id);
		r.close();
		r.container.remove();
		r.buttonObj.remove();
		
		delete openRoomsArray[id];
		delete r;
		
		var r=null;
		for(var key in openRoomsArray){
			if(openRoomsArray[key].id!="friendRoom")
			r = openRoomsArray[key]
		}
		focusRoom(r.id);
	}
	this.openGameRoom = function(){
		$("#iframe").hide(); // hide iframe is visible
		
		r = getRoomById("game_room");
		if(r!=null){
			focusRoom(r.id);
			return;
		}
		r = new GameRoom();
		r.init();
		openRoomsArray[r.id]=r;
		focusRoom(r.id);
	}
	
	
	function openPublicRoom(room){
		
		if(room.length<3){
			return;
		}
		r = getRoomById("public_"+room);
		if(r!=null){
			focusRoom(r.id);
			return;
		}
		
		if(IS_SUPPORT){
			r = new SupportPublicRoom(room);
		}else{
			r = new PublicRoom(room);
		}
		
		r.init();
		openRoomsArray[r.id]=r;
		joinPublicRoom(room);
		focusRoom(r.id);
	}

	function getRoomById(id){
		if(openRoomsArray[id]){
			return openRoomsArray[id]
		}
		return null;
	}
	
	function focusRoom(id){
		
		if(focusedRoom!=null){
			//focusedRoom.textInput = tinyMCE.getContent();
		}
		// BUG FIX opera: opera fucuses room  when close is pressed. We should check if room exists
		if(id!="system" && !getRoomById(id)){  // TODO:  id!="system" should be removed
			return;
		}
		for(var key in openRoomsArray){
			var r = openRoomsArray[key];
			
			if(r.id==id){
				
				r.focus();
				focusedRoom = r;
			}else{
				r.blur();
			}
		}
		/*if(!connected){
			disable();
		}*/
	}
	function notification(value){
		$("notifications").innerHTML="<div id='hojladri' class=\"notification\">"+value+"</div>";
		setTimeout("$('notifications').innerHTML=''", 5000);
	}
	function joinPublicRoom(room){
		var json = '{"f":"joinPublicRoom", "params":{"room":"'+room+'", "password":""} }';
		flashDataOutputHandler(json);
	}
	this.joinPublicRoom=joinPublicRoom;


	//DELETE ALL MESSAGE FORM USER WITH ID=userId
	/*function deleteMessages(nickname)
	{
		$('.msg4').remove()
	}*/
	
	this.openUserMenu = function(nickName){
		var r=getRoomById("public_"+focusedRoom.room);
		if(r==null)
		return
		
		r.openUserMenu(nickName);
	}
	this.openRoomMenu = function(nickName){
		var r=getRoomById("public_"+focusedRoom.room);
		if(r==null)
		return
		
		r.openRoomMenu();
	}
	this.openRoomMenu = function(){
		var r=getRoomById("public_"+focusedRoom.room);
		if(r==null)
		return
		
		r.openRoomMenu();
	
	}
	this.kickUser = function(nickName){
		closeMenu();
		if(!confirm(dic("confirm_kick_user")))
		return;
		var json = '{"f":"kickUser", "params":{"room":"'+focusedRoom.room+'", "nickName":"'+nickName+'", "reason":"'+prompt( dic("reason") )+'" } }';
		flashDataOutputHandler(json);
	}
	this.banUser = function(nickName){
		closeMenu();
		if(!confirm(dic("confirm_ban_user") ))
		return;
		var json = '{"f":"banUser", "params":{"room":"'+focusedRoom.room+'", "nickName":"'+nickName+'", "reason":"'+prompt( dic("reason") )+'" } }';
		flashDataOutputHandler(json);
	}
	this.getFocusedRoom=function(){
		return focusedRoom;
	}
	this.changeUserCrown = function(nickName, crown){
		closeMenu();
		var json = '{"f":"changeUserCrown", "params":{"room":"'+focusedRoom.room+'", "nickName":"'+nickName+'", "crown":"'+crown+'" } }';
		flashDataOutputHandler(json);
		
		if(crown==5){
			var hasModerator = focusedRoom.hasModerator();

			
			if(!hasModerator || focusedRoom.mode!=2 || !focusedRoom.isRecording){
				var html = "<div id=\"special_guest_start_options\"><h1>Možnosti sobe s posebnim gostom</h1>";
				
				if(!hasModerator){
					html+='<input type="checkbox" class="checkbox"  checked="checked" id="make_me_moderator_checkbox" /><label>Jaz bom moderator klepeta</label>';
				}
				if(focusedRoom.mode!=2){
					html+='<input type="checkbox" class="checkbox" id="change_to_moderated_checkbox"  checked="checked" /><label> Spremeni v moderiran klepet</label>';
				}
				if(!focusedRoom.isRecording){
					html+='<input type="checkbox" class="checkbox" id="start_recording_checkbox" checked="checked" /><label> Začni s snemanjem</label>';
				}
				html+="</div>";

				$.prompt(html,{
					onHtmlAtach: function(){
						$("#special_guest_start_options").jNice();
						
					},
					submit: function(v){
								
								if(v){
									
									var room = chat.getFocusedRoom();
									if(!room.hasModerator() && $("#make_me_moderator_checkbox").attr("checked")){
										var json = '{"f":"changeUserCrown", "params":{"room":"'+room.room+'", "nickName":"'+chat.getMyNickName()+'", "crown":"'+6+'" } }';
										flashDataOutputHandler(json);
									}
									if(!room.isRecording && $("#start_recording_checkbox"  ).attr("checked")){
										room.startRecording();
									}
									if(room.mode!=2 && $("#change_to_moderated_checkbox").attr("checked")){
										room.changeRoomMode(2);
									}
									
								}							
								return true;
							},
					buttons: { ok:{title:dic("ok"), value:true}, cancel:{title:dic("cancel"), value:false}  }
				});
			}
			
			
        
			// check if room is moderated
			// check if room has moderator
		}
	}
	this.publishMessage = function(obj, id){
		var json = '{"f":"publishMessage", "params":{"id":'+id+' } }';
		flashDataOutputHandler(json);
		$(obj).parent().parent().remove();
	}
	this.removePublishMessage = function(obj){
		$(obj).parent().parent().remove();
	}
	this.doSmilies = function(msg){
		var message = msg;
		
		message = this.addBBCode(message);
		
		
		
		//alert(message);
		message = message.replace(/\:\)/g, "<img class=\"smilie sm_smile\" src='"+DOMAIN+"skins/main_chat/images/spacer.gif' border='0'/> ");
		message = message.replace(/\:D/g, "<img class=\"smilie sm_biggrin\" src='"+DOMAIN+"skins/main_chat/images/spacer.gif' border='0'/> ");
		message = message.replace(/\:p/g, "<img class=\"smilie sm_razz\" src='"+DOMAIN+"skins/main_chat/images/spacer.gif' border='0'/> ");
		message = message.replace(/\:P/g, "<img class=\"smilie sm_razz\" src='"+DOMAIN+"skins/main_chat/images/spacer.gif' border='0'/> ");
		message = message.replace(/\;\)/g, "<img class=\"smilie sm_wink\" src='"+DOMAIN+"skins/main_chat/images/spacer.gif' border='0'/> ");
		message = message.replace(/\:\(/g, "<img class=\"smilie sm_sad\" src='"+DOMAIN+"skins/main_chat/images/spacer.gif' border='0'/> ");
		message = message.replace(/8\)/g, "<img class=\"smilie sm_glass\" src='"+DOMAIN+"skins/main_chat/images/spacer.gif' border='0'/> ");
		message = message.replace(/\&lt\;3/g, "<img class=\"smilie sm_heart\" src='"+DOMAIN+"skins/main_chat/images/spacer.gif' border='0'/> ");
		
		message = message.replace(/\:S/g, "<img class=\"smilie sm_wired\" src='"+DOMAIN+"skins/main_chat/images/spacer.gif' border='0'/> ");
		message = message.replace(/\:s/g, "<img class=\"smilie sm_wired\" src='"+DOMAIN+"skins/main_chat/images/spacer.gif' border='0'/> ");
		
		//message = message.replace(/\;\)/g, "<img class=\"smilie sm_wink\" src='"+DOMAIN+"skins/main_chat/images/spacer.gif' border='0'/> ");
		
		
		message = message.replace(/!!`/g, '"');
		message = message.replace(/!`/g, "'");
		
		
		
		
		// TODO: Should be moved outside this function
		
		return message;
	}
	this.addBBCode =function(text){
		
		// no HTML tags
		text = text.replace(/>/g, "&gt;");
		text = text.replace(/</g, "&lt;");
	
		var maxLength = 30;
		
		var search = new Array(
		     //     /\[img\](.*?)=\1\[\/img\]/,
		          /\[url=([\w]+?:\/\/[^ \\"\n\r\t<]*?)\](.*?)\[\/url\]/,
		          /\[url\]((www|ftp|)\.[^ \\"\n\r\t<]*?)\[\/url\]/,
		          /\[url=((www|ftp|)\.[^ \\"\n\r\t<]*?)\](.*?)\[\/url\]/,
		          /\[email\](([a-z0-9&\-_.]+?)@([\w\-]+\.([\w\-\.]+\.)?[\w]+))\[\/email\]/,
		          /\[b\](.*?)\[\/b\]/,
		          /\[url\](http:\/\/[^ \\"\n\r\t<]*?)\[\/url\]/,
				  /\[i\](.*?)\[\/i\]/,
				  /\[u\](.*?)\[\/u\]/
				  
				  );

		var replace = new Array(
		     //     "<img src=\"$1\" alt=\"An image\">",
		          "<a href=\"$1\" target=\"_blank\">$2</a>",
		          "<a href=\"http://$1\" target=\"_blank\">$1</a>",
		          "<a href=\"$1\" target=\"_blank\">$1</a>",
		          "<a href=\"mailto:$1\">$1</a>",
		          "<b>$1</b>",
		          "<a href=\"$1\" target=\"_blank\">$1</a>",
				  "<i>$1</i>",
				  "<u>$1</u>"
				  
				  
				  );
		for(i = 0; i < search.length; i++) {
				     text = text.replace(search[i],replace[i]);
		}
		
		// convert url-s to clickable links
		text = autolink(text);
		
		//alert(text);
		
		//return text;
		
		// shorten looooooong words
		var okString = "";
		var lengthAfterLastSpace=0;
		var insideTag = false;
		for(var x=0; x<text.length; x++){
			if(text.charAt(x)==">"){
				insideTag = false;
				//alert("we are outside tag");
			}
			
			if(!insideTag){
				if(text.charAt(x)==" " || text.charAt(x)=="\n"){
					lengthAfterLastSpace=0;
				}
				if(lengthAfterLastSpace == maxLength){
					
					//alert("adding spacer: "+ okString);
					okString+="<i class=\"invisibleSpacer\"> </i>"; // here the text will break
					
					lengthAfterLastSpace=1;
				}else{
					lengthAfterLastSpace++;
				}
			}
			okString += text.charAt(x);
			
			if(text.charAt(x)=="<"){
				insideTag = true;
				//alert("we are inside tag");
			}
		}
		
		//alert(okString);
		
		
		
		return okString;
		
		

	
	}
	// safe string should only remove " character as else it destruct JSON syntax
	this.safeString = function(text){
		// encode "
		return (text.replace(/'/g, "&#39;")+"").replace(/"/g, "&#34;");
	}
	
	// autolink: convert url to clickable links
	function autolink(s){   
	   //var hlink = /\s(ht|f)tp:\/\/([^ \,\;\:\!\)\(\"\'\<\>\f\n\r\t\v])+/g;
	   var hlink = /[^']?(ht|f)tp:\/\/([^ \,\;\:\!\)\(\"\'\<\>\f\n\r\t\v])+/g;
	   return (s.replace(hlink, function ($0,$1,$2) { s = $0.substring(0,$0.length); 
														//alert($0+"|"+$1+"|"+$2);
	                                                   // remove trailing dots, if any
	                                                   while (s.length>0 && s.charAt(s.length-1)=='.') 
	                                                      s=s.substring(0,s.length-1);
	                                                   // add hlink
	                                                   return " <a href=\""+s+"\" target=\"_blank\">"+s+"</a> "; 
	                                                 }
	                     ) 
	           );

	}
	this.autolink = autolink; // make it public
	
	this.changeRoomMode = function(room, mode){
		var json = '{"f":"changeRoomMode", "params":{"room":"'+room+'", "mode":"'+mode+'" } }';
		flashDataOutputHandler(json);
		closeMenu();
	}
	this.changeRoomTopic = function(topic){
		html = dic("choose_topic")+'<br />';
		
		
		html+='<input type="text" id="changeTopic" name="changeTopic" value="" />';
		$.prompt(html,{
			submit: chat.changeRoomTopicFinish,
			buttons: { ChangeTopic:{title:dic("change_topic"), value:true}, cancel:{title:dic("cancel"), value:false}  }
			//callback: chat.connectFromPrompt
		});
	}
	this.changeRoomTopicFinish = function(clicked){
		if(!clicked){
			return true;
		}
		var room=getRoomById("public_"+focusedRoom.room).room;		
		var topic = $("#changeTopic").attr("value");
		var json = '{"f":"changeRoomTopic", "params":{"room":"'+room+'", "topic":"'+topic+'" } }';
		flashDataOutputHandler(json);
		return true;
	}
	this.viewUserProfile = function(nickName){
		openIframeURL("http://localhost/chat/user/"+nickName);
	
	}
	this.openRoomInfo = function(){
		
		openIframeURL("http://localhost/chat/room/"+focusedRoom.room);
	}
	this.editSettings = function(){
		var html =""
		+'<div id="settingsPanel">'
		+'<fieldset id="privacyPanel">'
		+'<legend >'+dic("privacy")+'</legend>'
		+'<div><input type="radio" name="pr" value="1" '+(chat.privacy==1?"checked=checked":"")+'> '+dic("privacy_public")+"</div>"
		+'<div style="clear:both"><input type="radio" name="pr" value="3" '+(chat.privacy==3?"checked=checked":"")+'> '+dic("privacy_private")+"</div>"
		+'</fieldset>'
		
		//+'<fieldset>'
		//+'<legend>'+dic("sound")+'</legend>'
		//+'<div><input type="checkbox" '+(this.alowSounds?"checked=checked":"")+' name="alowSounds" id="alowSounds" value="1" onclick="chat.soundSettings(this.value)"> '+dic("alow_sounds")+"</div>"
		//+'<div style="clear:both"><input type="radio" name="pr" value="3" onclick="changeMyPrivacy(this.value)"> '+dic("privacy_private")+"</div>"
		//+'</fieldset>'
		+'</div>';
		$.prompt(html,{
			submit: chat.trySaveSettings,
			buttons: { ok:{title:dic("save"), value:true},cancel:{title:dic("cancel"), value:false} },
			onHtmlAtach: function(){
				$("#settingsPanel").jNice();
				
			}
			//, 	callback: function(k){alert("Izbrali smo: "+k)}
		});
	}
	this.trySaveSettings = function(v,m){
		if(v==false){
			return true; // cancel save
		}
		$("#privacyPanel input:radio").each(function(i){
			if($(this).attr("checked")==true){
				chat.privacy = ($(this).attr("value"));
				return false;
			}
		});
		// should be self
		chat.changeMyPrivacy(chat.privacy);
		
		
		if($("#alowSounds").attr("checked")){
			chat.alowSounds = true;
		}else{
			chat.alowSounds = false;
		}
		
		
		return true;
	}
	this.loadApplication = function(name, isServer){
		
		focusedRoom.loadApplication(name, isServer);
	}
	
	this.allowInviteResponse = true; 
	
	
	this.inviteResponse = function(nickName, application){
		// when user click on li > play
		flashDataOutputHandler('{"f":"privateUserMessage" , "params":{"nickName":"'+nickName+'", "message":"/app:app_invite_response:'+application+'"} }');
	}
	this.openApplicationCallback=function(application, nickName){  // called when application is opened
		this.allowInviteResponse=false;
		
		setTimeout(function(){
			self.allowInviteResponse=true;
		
		}, 3000);
		r = getRoomById("game_room");
		if(r!=null){
			r.openApplicationCallback(application, nickName);
		}
		return; 
	}
	
	this.startRecording = function(id){
		r = getRoomById(id);
		if(r!=null){
			r.startRecording();
		}
	}
	this.stopRecording = function(id){
		r = getRoomById(id);
		if(r!=null){
			r.stopRecording();
		}
	}
	


}


function extendsWithSuper(_class, extendClassName){
	//alert(extendClassName);
	eval("var _extends = new "+extendClassName+"()");
	for(var i in _extends){
		_class["super$"+i] = _extends[i];
		//if(typeof(_class[i])=="undefined"){
			//_class[i] = _extends[i];
			
		//}
	}
	delete _extends;

}




function Room(id){
	this.id = id; 
	this.type = null;	
	this.urlIdentifier = "";
	
	this.applicationObj = null;
	this.applicationName = null;
	
	this.tabClass = "";
	this.focused = false;
	this.isScrolling = true;
	this.mouseIsDown = false;
	
	this.super$focus = function(){
		
		//alert("focusiram v room.js");
		//this.container.show();
		if(this.applicationObj==null){
			//this.container.show(); // .show() causes swf to rerender!!!
		}
		this.container.css("visibility", "visible"); // .show() causes swf to rerender!!!
		
		
		
		this.buttonObj.addClass("focused");
		this.buttonObj.removeClass("newMessage");
		this.focused = true;
		if(this.textArea){
			this.textArea.focus();
		}
		

		// scroll to bottom
		if(this.chatObj){
			this.chatObj[0].scrollTop = this.chatObj[0].scrollHeight;
		}
		
		//alert("focusiram v room.js.zadeva bi mogla bit vidna");
		
		if( !($.browser.msie && $.browser.version<7) ){ /* IE 6 becomes very slow if I call anchor that do not exists */
			setTimeout('document.location.href="#'+this.urlIdentifier+'"', 20);
		}
	}

	this.focus = function(){
		this.super$focus();
		
	}
	
	this.blur = function(){
		if(this.applicationObj==null){
			//this.container.hide(); // .hide() causes swf to rerender!!!
		}
		this.container.css("visibility", "hidden"); // .show() causes swf to rerender!!!
		
		//this.container.hide();
		this.buttonObj.removeClass("focused");
		this.focused = false;
	
	}
	this.tabButton = function(title){
		$("#buttons").append('<h3 class="'+this.tabClass+'" id="roomB_'+this.id+'" onclick="chat.focusRoom(\''+this.id+'\'); return false;"><div class="insideH3"><b class="light"></b><b class="tabTitle">'+ title +'</b> <a class="close" href="#" onclick="chat.closeRoom(\''+this.id+'\'); return false"></a></div><div class="right_corner"></div></h3> ');
		this.buttonObj = $("#buttons > #roomB_"+this.id);
	}
	function init(){
		// append button 
		this.tabButton(this.id);
		// append room HTML
		$("#rooms").append('<div id="privateRoom_'+this.id+'" class="room privateRoom"><div class="mode"><div class="application"><a href="#" class="close"></a><div class="container"></div></div><div class="chat"></div><div class="right"><h3>Futured Apps</h3><ul><li><a href="#" onclick="chat.loadApplication(\'game\'); return false">Four in a row</a></li><li><a href="#" onclick="chat.loadApplication(\'game\'); return false">Four in a row</a></li><li><a href="#" onclick="chat.loadApplication(\'game\'); return false">Four in a row</a></li></ul></div><textarea onkeydown="return chat.trySendMessage(event, this)"></textarea></div></div>');
		this.container = $("#rooms > #privateRoom_"+this.id);
		this.chatObj = $("#rooms  > #privateRoom_"+this.id +" .chat");	
		
		
//		var roomUsers = $("#rooms  > #privateRoom_"+this.id +" > .users");
		this.textArea = $("#rooms  > #privateRoom_"+this.id +" > textarea");
	}
	this.close = function(){
	
	}
	this.newMessage=function(){
		if(!this.focused){
			this.buttonObj.addClass("newMessage");
		}
	}
	this.loadApplication = function(name){
		if(name==this.flashApplication){
			$.prompt(dic("app_already_open"));
			return;
		}
		$(".mode", this.container).addClass("withApplication");
		
		
		
		$(".application a.close", self.container).click(function(){
			$(".application .container", self.container).html("");
	
			$(".mode", self.container).removeClass("withApplication");
			self.flashApplicationObj = null;
			self.flashApplication = null;
		});
		$(".application .container", self.container).html("Loading application ...");
		$.getJSON(DOMAIN+"applications/"+name+".php", function(json){
			
			//alert("1");
			//alert(json.file);
			var so = new SWFObject(DOMAIN+"applications/game.swf", "user_"+cEscape(self.adjacentNickName)+"_APP", "280", "200", "9", "#336699");
			so.addVariable("nickName", escape(self.adjacentNickName));
			so.addParam("wmode","transparent");
			//$(".application", self.container).html(so.getSWFHTML());
			
			//alert("2");
			$(".application .container", self.container).html(so.getSWFHTML());
			self.flashApplicationObj = thisMovie("user_"+cEscape(self.adjacentNickName)+"_APP");
			self.flashApplication = name;
			
			
			
			self.sendMessage("/app:app_invite:"+name);
			//alert("3");/**/
		}
		);
		
		// */
	}
	this.receiveMessage = function(params, user){
		this.super$receiveMessage(params, user);
	}
	this.super$receiveMessage = function(params, user){
		if(!this.focused){
			this.buttonObj.addClass("newMessage");
		}
		this.appendMessage(params.nickName, params.message, user);	
	}

	this.systemMessage = function(params){
		obj = this.chatObj;
		if(!this.focused){
			this.buttonObj.addClass("newMessage");
		}
		var msg=params.message;
		if(msg=="User.offline"){
			msg=dic("user_is_offline");
			this.onUserOffline();
		}
		obj.append("<div class='systemMessage'>"+msg+"</div>");
		obj[0].scrollTop = obj[0].scrollHeight;
	}
	this.sendMessage=function(msg, user){
		this.super$sendMessage(msg, user);
	}
	this.onUserOffline=function(){
	
	}
	this.super$sendMessage=function(msg, user, noAnimation){
		
		this.appendMessage(chat.getMyNickName(), msg, user, noAnimation);
	}
	this.appendHtml=function(html, noAnimation){
		var obj = this.chatObj;
		obj.append(html);
		
		if(noAnimation){
			//obj[0].scrollTop = obj[0].scrollHeight;
		}else{
			if(this.isScrolling){
				this.chatObj.stop();
				this.chatObj.animate({scrollTop: this.chatObj[0].scrollHeight}, 1000);
			}
		}
	}
	this.appendMessage=function(nickname, message, user, noAnimation){
		var specialGuest = user.crown=="5";
		if(nickname==chat.getMyNickName()){
			this.isScrolling = true;
			this.mouseIsDown = false;
			if(IS_SUPPORT){
				user.displayName = dic("me");
			}
		}
		this.appendHtml("<div class=\"msg"+( (specialGuest)?" specialGuest":"")+"\"><span class=\"msg_author\"><a href='#' onclick=\"chat.openUserMenu('"+nickname+"', '"+user.displayName+"'); return false\"'>"+user.displayName+"</a><span class=\"msg_colon\">:</span></span> <span class=\"msg_content\">"+chat.doSmilies(message)+"</span></div>", noAnimation);
	}
	
	
	this.disable=function(){
		this.textArea.attr("disabled", "disabled");
		this.container.addClass("disabled");
	}
	this.enable=function(){
		
		this.textArea.attr("disabled", "false");
		this.container.removeClass("disabled");
	}	



}PublicRoom.prototype = new Room; 
function PublicRoom(room){
	this.id = "public_"+room;  
	this.users = new Array();
	this.room = room;
	this.type="public";
	this.focused = false;
	this.crown = 0;
	this.mode = 1; // room mode: normal, moderated ...
	this.isRegistered = false;
	this.urlIdentifier = "room="+this.room;
	this.tabClass = "roomBtn";
	this.canBeRecorded = false;
	this.guestCanChat = true;
	
	var self = this;
	
	this.init = function(){
		
		// append button 

		
		this.tabButton(this.room);
		//$("#buttons").append('<h3 id="roomB_'+this.id+'" class="roomBtn" onclick="chat.focusRoom(\''+this.id+'\'); return false;"><b>'+this.room+'</b><a class="close" onclick="chat.closeRoom(\''+this.id+'\'); return false;"></a></h3> ');
		//	var button = $("#buttons > #roomB_"+this.id);
		// append room HTML
		var room_options = 	 '<div class="room_info">' +
							//+'<div class="buttons"><a id="room_'+this.room+'_options" href="#" onclick="chat.openRoomMenu(); return false">'+dic("room_options")+'</a><a id="room_'+this.room+'_info" href="#" onclick="chat.openRoomInfo(); return false">'+dic("room_info")+'</a></div></div>';
							'<div class="buttons">' +
							' <a style="margin-left:10px;" id="room_'+this.room+'_options" href="#" onclick="chat.openRoomMenu(); return false">'+dic("room_options")+'</a><a id="room_'+this.room+'_info" href="#" onclick="chat.openRoomInfo(); return false">'+dic("room_info")+'</a>';
		if(IS_FACEBOOK || !INTEGRATED_CHAT){
			room_options+=	'<a  href="http://www.addthis.com/bookmark.php" '+
							'onmouseup="return addthis_open(this, \'\', \''+CHAT_URL_CONTAINER+'?room='+this.room+'\', \'Talcho chat\');"'+ 
							'onmouseout="addthis_close();" '+
							'onclick="return false">'+dic("share")+'</a>';
		}
		room_options+=		'</div><div class="topic">'+this.room+'</div></div>'
							;
		
		
		
		
		var ads = '<div style="width:500px;margin:0 auto;"><iframe style="border:none;" noresize="noresize" frameborder="0" border="0" width="495" height="70" src="/facebookAds.php"></iframe></div> ';
		ads="";
		
		
		
		$("#rooms").append('<div id="publicRoom_'+this.id+'" class="room publicRoom">'+room_options+'<div class="chat">'+ads+'  </div><ul class="users"></ul><div class="textarea_container"><textarea onkeydown="return chat.trySendMessage(event, this)"></textarea></div></div>');
		this.container = $("#rooms > #publicRoom_"+this.id);
		this.chatObj  = $("#rooms > #publicRoom_"+this.id +" > .chat");	
		this.usersObj = $("#rooms > #publicRoom_"+this.id +" > .users");
		this.textArea = $("#rooms > #publicRoom_"+this.id +" textarea");
		
		$("#room_"+this.room+"_info").hide();
		$("#room_"+this.room+"_options").hide();	


		this.topicObj = $("div.topic", this.container);
		this.users = new Array(); // stored room users
		
		
		this.chatObj.mousedown(function(){
			self.mouseIsDown = true;
			//self.isScrolling = false;
		});
		this.chatObj.mouseup(function(){
			self.mouseIsDown = false;
			//self.isScrolling = true;
		});
		this.chatObj.scroll(function(){
			if(self.mouseIsDown){
				//$("#four_in_row_scale").html( self.chatObj.outerHeight() + " " + (self.chatObj[0].scrollHeight - self.chatObj.scrollTop())  );
				
				//elem[0].scrollHeight - elem.scrollTop() == elem.outerHeight()
				
				if(self.chatObj.outerHeight() >= self.chatObj[0].scrollHeight - self.chatObj.scrollTop() ){
					if(!self.isScrolling){
						self.isScrolling = true;
					}
				}else{
					if(self.isScrolling){
						self.isScrolling = false;
					}
				}
			
			}
		
		});
		
		//this.chatObj.scroll(function(){
			
		
		//});
		
		

		
	}
	this.disable=function(){
		
		this.textArea.attr("disabled", "disabled");
		this.container.addClass("disabled");
		
		
		
		
		
	}
	this.defineRoom=function(params){
		if(params.mode!=1){
			this.changeRoomMode(params.mode);
		}
		if(params.topic!="null" && params.topic !=""){
			
			this.changeRoomTopic(params.topic);
		}
		
		if(params.isRegistered){
			this.setToRegisteredRoom();
		}
		
		
		
		
		for(key in params.users){
			this.addUser(params.users[key]);
		
		}
		
		this.isRecording=params.isRecording;
		if(this.isRecording){
			this.startRecordingMessage();
		}
		this.canBeRecorded = params.canBeRecorded;
		
		var historyHtml = "";
		for(key in params.history){
			var user = params.history[key].user;
			var message = params.history[key].message;
			historyHtml+="<div class='msg history_msg"+(user.crown==5?" specialGuest":"")+"'><a href='#' onclick=\"chat.openUserMenu('"+user.nickName+"');return false;; return false\"'>"+user.displayName+"</a>: "+chat.doSmilies(message)+"</div>";
		}
		this.chatObj.append(historyHtml);
		
		
		this.guestCanChat=params.guestCanChat;
		if(!this.guestCanChat && !chat.user.isRegistered){
			
			this.textArea.parent().click(function(){
				$.prompt(dic("guest_can_not_chat"));
			});
			this.textArea.hide();
			this.textArea.attr("disabled", true);
			
			$.prompt(dic("guest_can_not_chat"));
		}
		
		
		this.chatObj[0].scrollTop = this.chatObj[0].scrollHeight;
	
	}
	this.enable=function(){
		this.usersObj.empty();
		delete this.users; 
		this.users = new Array();
		this.textArea.attr("disabled", "");
		this.container.removeClass("disabled");
		
		setTimeout(function(){
			JSON = '{"f":"joinPublicRoom", "params":{"room":"'+self.room+'", "password":""} }'
			chat.flashDataOutputHandler(JSON);
		},400);
		
		
	}
	this.close=function(){
		
		JSON = '{"f":"leavePublicRoom", "params":{"room":"'+this.room+'"} }';
		chat.flashDataOutputHandler(JSON);
		
	}
	this.changeUserCrown = function(nickName, crown){
		var escapedNickName=cEscape(nickName);
		this.users[escapedNickName].crown = crown;
		var user = this.users[escapedNickName];
		
		// remove
		$('.'+room+'_'+escapedNickName+'_'+'info').remove();
		
		if(nickName==chat.getMyNickName() ){
			if(user.crown>=5){
				$("#room_"+this.room+"_options").show();
			}else{
				$("#room_"+this.room+"_options").hide();
			}
		}
		
		delete this.users[escapedNickName];
		
		
		
		
		//alert("adidng user");
		this.addUser(user);
		

	}
	this.changeUserPrivacy = function(nickName, privacy){
		var escapedNickName=cEscape(nickName);
		this.users[escapedNickName].privacy = privacy;
	}
	
	this.addUser = function(user){

		if(parseInt(user.crown)>=5  && user.nickName==chat.getMyNickName()){
			$("#room_"+this.room+"_options").show();
		}
	
	
		//alert("adding user:"+user.nickName);
		var escapedNickName=cEscape(user.nickName);
		emHtml = ""; // no special meaning
		switch( parseInt(user.crown) ){
			case 7:
			emHtml = "@"; // channel operator
			break;
			case 4:	
			emHtml = "+"; // channel voice
			break;
			case 5:
			emHtml = ""; // special guest
			break;
			case 6:
			emHtml = "M"; // moderator
			break;
			default:
			break;
		}
		if (typeof(this.users[escapedNickName])=="undefined")
		{
			//alert(escapedNickName);
			this.users[escapedNickName] = user;
			var usersArray = this.users; // we need pointer so we can use users var inside jquery function
			
			
			var userIsAppended = false;
			$("li", this.usersObj).each(
				function(intIndex)
				{
					
					var displayName = $("b", $(this))[0].innerHTML;
					var nickName = $(this).attr("alt");
					//alert("gremo cez li:"+displayName);
					var escapedNickName2=cEscape(nickName);
					
					//alert("moni)");
					
					var weight = 9;
					weight = 9-usersArray[escapedNickName2].crown;
					if(usersArray[escapedNickName2].crown=="5"){
						weight=0; // special users go to top
					}
					var sortItem = weight+""+displayName.toLowerCase();
					var intUserCrown = parseInt(user.crown);
					if(intUserCrown==5){
						// special sort (sort to top)
						intUserCrown = 9;
					}
					
					//alert("moni)");
					var sortNewItem = ( 9- intUserCrown)+""+ ((user.displayName).toLowerCase());
					if(sortItem > sortNewItem){
						//alert("pripopano");
						$(this).before("<li alt=\""+user.nickName+"\" onmouseover=\"$(this).addClass('hovered');\" onmouseout=\"$(this).removeClass('hovered');\" class='"+room+"_"+cEscape(user.nickName)+"_info'><a href=\"#\" onclick='chat.openUserMenu(\""+user.nickName+"\"); return false;' >"+((user.picture).length>5!=""?"<img class=\"avatar\" src=\""+user.picture+"\" />":"")+"<span class=\"status\"><span class=\""+statusArray[user.statusId]+"\"></span></span><em>"+emHtml+"</em><b>"+user.displayName+"</b></a><div class='content'></div></li>"); //<button onclick=\"chat.openUserMenu('"+user.nickName+"');return false;\">?</button>
						userIsAppended = true;
						return false;  //  break;
					}
				}
			);
			
			//alert("check if ("+escapedNickName+"appended"+userIsAppended);
			if(!userIsAppended){
				//alert("en ni pripopano");
				this.usersObj.append("<li alt=\""+user.nickName+"\" onmouseover=\"$(this).addClass('hovered');\" onmouseout=\"$(this).removeClass('hovered');\" class='"+room+"_"+cEscape(user.nickName)+"_info'><a href=\"#\" onclick='chat.openUserMenu(\""+user.nickName+"\"); return false;' >"+((user.picture).length>5?"<img  class=\"avatar\" src=\""+user.picture+"\" />":"")+"<span class=\"status\"><span class=\""+statusArray[user.statusId]+"\"></span></span><em>"+emHtml+"</em><b>"+user.displayName+"</b></a><div class='content'></div></li>");
			}
			if(user.crown==5){	// special guest
				var obj=$("."+room+"_"+cEscape(user.nickName)+"_info").addClass("specialGuest").find("div");
				
				//alert(user.picture);
				if(/*user.isRegistered!="false" &&*/ (user.picture).length>5){
					//alert(user.picture);
					obj.html('<img class="special_guest_avatar" src="'+user.picture+'" />');
				}else{
					obj.remove(); // TODO: do it drgac :D
				}
				
			}else{
				$("."+room+"_"+cEscape(user.nickName)+"_info").removeClass("specialGuest");
			}
			
			// TODO check if not done before!!


			
			
		}else{ // end if
			//alert("els..."+this.users[escapedNickName].nickName);
		}
		
		//alert("user shoudl be appended");
	}
	
	this.sendMessage = function(msg){
		
		
		
		var nickName = chat.getMyNickName();
		var messageIsAppended = false;
		if(parseInt(this.users[cEscape(chat.getMyNickName())].crown)<4 && parseInt(this.mode) == 2){
			var haveModerator = false;
			for(var key in this.users){
				//alert(parseInt(this.users[key].crown));
				if(parseInt(this.users[key].crown)==6){
					this.chatObj.append("<div class='msg'><a href='#' onclick=\"chat.openUserMenu('"+nickName+"');return false;; return false\"'>"+this.users[cEscape(nickName)].displayName+"</a> <em>"+dic("say_to_moderator")+"</em>: "+chat.doSmilies(msg)+"</div>");
					this.chatObj[0].scrollTop = this.chatObj[0].scrollHeight;
					haveModerator = true;
					messageIsAppended = true;
					break;
				}
			}
			if(!haveModerator){
				$.prompt(dic("no_speak_priv"));
				return;
			}
		}
		var safeMessage = chat.safeString(msg);
		var JSON = '{"f":"publicRoomMessage", "params":{"room":"'+this.room+'", "message":"'+safeMessage+'"} }';
		chat.flashDataOutputHandler(JSON);
		
		
		
		
		
		if(!messageIsAppended){
			
			this.hideMyMessagesTimerStart();
			
			this.appendMessage(nickName, safeMessage, this.users[cEscape(nickName)]);
		}
		
	}
	// hide my messages
	this.hideMyMessages=false;
	this.hideMyMessagesTimeout = undefined;
	this.hideMyMessagesTimerStart=function(){
		self.hideMyMessages=true;
		if(typeof(this.hideMyMessagesTimeout)!="Undefined"){
			clearTimeout(this.hideMyMessagesTimeout);
		}
		this.hideMyMessagesTimeout = setTimeout(function(){ self.hideMyMessages=false; }, 2000);
	
	}
	this.moderateMessage = function(nickName, msg, id){
		var escapedNickName=cEscape(nickName);
		//alert(this.users[escapedNickName].crown);
		if( parseInt(this.mode) == 2){  // TODO: why is result of comments 0. ... all should be uncommented
			
			var u = this.users[cEscape(nickName)];
			if(u){
				this.chatObj.append("<div class='msg moderateMessage'><a href='#' onclick=\"chat.openUserMenu('"+nickName+"');return false;\"'>"+u.displayName+"</a> : "+chat.doSmilies(msg)+"<div class=\"publish\"><button class=\"publish\" onclick=\"chat.publishMessage(this, "+id+")\">"+dic("publish")+"</button><button class=\"publish\" onclick=\"chat.removePublishMessage(this)\">"+dic("remove")+"</button></div></div>");
				this.chatObj[0].scrollTop = this.chatObj[0].scrollHeight;
			}
		}
	}
	
	
	
	
	
	
	this.changeRoomMode = function(mode){
		mode = parseInt(mode);
		this.mode = mode;
		var msg="";
		switch(parseInt(mode)){
			case 1:
			msg = dic("room_normal_mode");
			break;
			case 2:
			msg = dic("room_moderated_mode");
			break;
			case 3: // everybody can voice themself
			msg = "soba je v stanju 3";
			break;		
		}
		if(msg){
			this.appendHtml('<div class="info">'+msg+'</div>');
			//this.chatObj.append();
			//this.chatObj[0].scrollTop = this.chatObj[0].scrollHeight;
		}
	}

	this.openUserMenu = function(nickName){
		var escapedNickName=cEscape(nickName);
		if(!this.users[escapedNickName]){
			return; // user is not in this room anymore
		}
		var html ='<ul>';
		
		
		//alert(this.users[nickName].privacy)
		if(parseInt(this.users[escapedNickName].privacy)==1 && nickName != chat.getMyNickName()){
			if(parseInt(this.users[escapedNickName].crown)!=5 || (parseInt(this.users[escapedNickName].crown)==5 && parseInt(this.users[cEscape(chat.getMyNickName())].crown)>=5)){
				html += '<li><a href="#" onclick="chat.openPrivateRoom(\''+nickName+'\'); return false;">'+dic("private_conversation")+'</a></li>';
			}else{
				return;
			}
		}
		
		if(this.users[escapedNickName].isRegistered=="true"){
			//html += '<li><a href="#" onclick="chat.viewUserProfile(\''+nickName+'\'); return false;">'+dic("user_profile")+'</a></li>';
		}
		var me = this.users[cEscape(chat.nickName)];
		if(me.crown>=6){
			html += '<li><a href="#">'+dic("change_user_crown")+'</a><ul>';
			if(me.crown>=7){ // you can give OP to others
				html += '<li><a href="#" onclick="chat.changeUserCrown(\''+nickName+'\',7); return false;">'+dic("operator")+'</a></li>';
			}
			
			html += 	'<li><a href="#" onclick="chat.changeUserCrown(\''+nickName+'\',6); return false;">'+dic("moderator")+'</a></li>';
			if(this.canBeRecorded){
				html += 	'<li><a href="#" onclick="chat.changeUserCrown(\''+nickName+'\',5); return false;">'+dic("special_guest")+'</a></li>';
			}
			html += 	'<li><a href="#" onclick="chat.changeUserCrown(\''+nickName+'\',4); return false;">'+dic("voice")+'</a></li>';
			html += 	'<li><a href="#" onclick="chat.changeUserCrown(\''+nickName+'\',1); return false;">'+dic("normal")+'</a></li>';
			html += '</ul></li>';
		
		
			html += '<li><a href="#" onclick="chat.kickUser(\''+nickName+'\'); return false;">'+dic("kick_user")+'</a></li>';
			html += '<li><a href="#" onclick="chat.banUser(\''+nickName+'\'); return false;">'+dic("ban_user")+'</a></li>';
		}
		
		
		
		//html += '<li><a href="#" onclick="chat.reportSpamUser(\''+nickName+'\')">'+dic("report_spam")+'</a></li>';
		
		
		html += "</ul>";
		
		
		
		openMenu(html);
	}
	this.openRoomMenu = function(){
		
		var html ='<ul>';
		//html += '<li>		<a href="http://www.addthis.com/bookmark.php?v=250" onclick="return addthis_open(this, \'\', \'http://talcho.com\', \'Check out this chat\')" ">'+dic("invite_friends")+'</a></li>';
		html += '<li><a href="#">'+dic("change_room_mode")+'</a><ul>';
		if(this.mode!=1)
		html += '<li><a href="#" onclick="chat.changeRoomMode(\''+this.room+'\', 1); return false;">'+dic("normal_mode")+'</a></li>';
		if(this.mode!=2)
		html += '<li><a href="#" onclick="chat.changeRoomMode(\''+this.room+'\', 2); return false;">'+dic("moderated_mode")+'</a></li>';
		html += '</ul></li>';
		
		html += '<li><a href="#" onclick="chat.changeRoomTopic(\''+this.room+'\', 1); return false;">'+dic("change_topic")+'</a></li>';
		
		// record chat
		if(this.canBeRecorded && parseInt(this.getActiveUser().crown) > 5 ){
			if(!this.isRecording){
				html += '<li><a href="#" onclick="chat.startRecording(\''+this.id+'\'); return false;">'+dic("start_recording")+'</a></li>';
			}else{
				html += '<li><a href="#" onclick="chat.stopRecording(\''+this.id+'\'); return false;">'+dic("stop_recording")+'</a></li>';
			}
		}
		
		
		//html += '<li><a href="#" onclick="chat.editBanList(\''+this.room+'\', 1); return false;">'+dic("edit_banlist")+'</a></li>';
		
		//html += '<li><a href="#" onclick="chat.registerRoom(\''+this.room+'\', 1)">'+dic("register_room")+'</a></li>';

		html += "</ul>";
		openMenu(html);
	}
	this.changeRoomTopic = function(topic){
		
		this.topicObj.html(chat.doSmilies(topic));
	}
	this.receiveMessage = function(nickName, displayName,  msg){
		
		this.newMessage();
		
		//if(this.isRecording){
		//	this.saveMessage(this.users[cEscape(nickName)], msg);	
		//}
		
		if(nickName == chat.getMyNickName() && this.hideMyMessages){
				if(this.mode==2 && parseInt(this.users[cEscape(nickName)].crown)<4){
					// message can be apended. WHY?????
				}else{				
					
					return;
				}		
		}
		if(this.users[cEscape(nickName)]){
			this.appendMessage(nickName, msg, this.users[cEscape(nickName)]);
		}else if(displayName!=""){
			var u = {"nickName":nickName, "displayName":displayName};
			this.appendMessage(nickName, msg, u);
		}
		
		
	}
	/*this.appendMessage = function(nickName, msg){
		this.chatObj.append("<div class='msg"+nickName+" "+((this.users[nickName].crown=="5")?"specialGuest":"")+" '><a href='#' onclick=\"chat.openUserMenu('"+nickName+"');return false;; return false\"'>"+nickName+"</a>: "+chat.doSmilies(msg)+"</div>");
		
		
		// TODO: if(this.focused // animate only focused window
		this.chatObj.stop();
		this.chatObj.animate({scrollTop: this.chatObj[0].scrollHeight}, 1000);
		
		// TODO: else   
		//this.chatObj[0].scrollTop = this.chatObj[0].scrollHeight;
	
	}*/
	
	
	this.setToRegisteredRoom = function(){
		this.isRegistered = true;
		//$("#room_"+this.room+"_info").show();	
	}
	this.removeUser = function(nickName){
		if (this.users[cEscape(nickName)] != null)
		{
			var user = this.users[cEscape(nickName)];
			//alert($('.'+room+'_'+cEscape(nickName)+'_info').size());
			$('.'+room+'_'+cEscape(nickName)+'_info').remove();
			
			
			// somebody is leaving
			r.appendHtml("<div class=\"log_message\"><i>"+dic("user_has_left", user.displayName)+"</i></div>");
			delete user;
			delete this.users[cEscape(nickName)];
		}
		
		else
		{
			//alert("There is no such user in this room!");
		}
	
	}
	
	
	this.isRecording = false;
	
	
	this.startRecordingMessage=function(){
		
		this.isRecording = true;
		if(parseInt(this.getActiveUser().crown)>5){
			this.appendHtml("<div class='msg'><em style='color:red'>"+dic("recording_started")+' </em></div>');
		}
	}
	
	this.startRecording = function(){
		/*var self = this;
		//self.appendHtml("<div class='msg'><em style='color:red'>Recording request sent</em></div>");
		
		$.post( "/talcho/talcho.history_recording.php?start_recording=1",{"network":NETWORK, "room":this.room }, function(data){
			if(data.error==0){
				self.isRecording = true;
				self.appendHtml("<div class='msg'><em style='color:red'>"+dic("recording_started")+"</em></div>");
			}else{
				$.prompt(dic("error_with_recording"),{
					buttons: { ok:{title:dic("ok"), value:true} }
				});
			}
		},"json");
		*/
		
		
		
		var JSON = '{"f":"startRecording", "params":{"room":"'+this.room+'"}}';
		chat.flashDataOutputHandler(JSON);
		
		
		//this.isRecording = true;
	}
	this.stopRecordingMessage=function(){
		
		this.isRecording = false;
		if(parseInt(this.getActiveUser().crown)>5){
			this.appendHtml("<div class='msg'><em style='color:red'>"+dic("recording_stopped")+' <a target="_blank" href="http://talcho.com/talcho/get_rss.php?network='+NETWORK+'">RSS</a>'+"</em></div>");
		}
	}
	
	this.stopRecording = function(){
		/*var self = this;
		$.post( "/talcho/talcho.history_recording.php?stop_recording=1",{"network":NETWORK, "room":this.room }, function(data){
			if(data.error==0){
				self.isRecording = false;
				self.appendHtml("<div class='msg'><em style='color:red'>"+dic("recording_stopped")+' <a target="_blank" href="'+data.rssUrl+'">RSS</a>'+"</em></div>");
			}else{
				$.prompt(dic("error_with_recording"),{
					buttons: { ok:{title:dic("ok"), value:true} }
				});
			}
		},"json"); */
		var JSON = '{"f":"stopRecording", "params":{"room":"'+this.room+'"}}';
		chat.flashDataOutputHandler(JSON);
		
	}
	this.saveMessage = function(user, msg){
		/*$.post( "/talcho/talcho.history_recording.php", 
				{	"network":NETWORK, "room":this.room , 
					"display_name":user.displayName, 
					"is_special_guest": (user.crown==5?1:0), 
					"msg":msg 
				},
				function(data){
					//alert(data);
				}
			);*/
	}
	this.hasModerator = function(){
		for(u in this.users){
			if(parseInt(this.users[u].crown) == 6){
				return true;
			}
		}
		return false;
	
	}
	this.getActiveUser=function(){
		for(u in this.users){
			if(this.users[u].nickName == chat.getMyNickName()){
				return this.users[u];
			}
		}
		console.error("no such user");
	
	}
	
}freeAppId=0;
freeAppIdArray=new Array();
function getUserAppId(escapedNickName){ // nickname is not enough as flash and JS has different escaping
	if(freeAppIdArray[escapedNickName]==null){
		freeAppIdArray[escapedNickName]=freeAppId;
		freeAppId++;
	}
	return freeAppIdArray[escapedNickName];
}

PrivateRoom.prototype = new Room; 
function PrivateRoom(nickName){ 

	this.id = "private_"+cEscape(nickName); 
	this.adjacentNickName = nickName;
	this.urlIdentifier = "user="+this.adjacentNickName;
	this.type="private";
	this.applicationObj = null;
	this.applicationName = null;
	
	var self = this;
	this.adsIsDisplayed = false;
	this.user = null; // adjacent user
	this.waitList = new Array();
	this.history = Array();
	this.historyIsReady=false;
	
	this.init = function(){
		this.tabButton(dic("loading_user"));
		
		
		
		$("#rooms").append('<div id="privateRoom_'+this.id+'" class="room privateRoom"><div class="mode"><div class="application"><a href="#" class="close" onclick="return false"></a><div class="container"></div><div class="centerAdsContainer"></div></div><div class="chat"></div><div class="right"><h3 class="userDisplayName"></h3><div class="userPictureContainer"></div><h3>'+dic("app_list")+'</h3><div class="content"></div></div><div class="textarea_container"><textarea onkeydown="return chat.trySendMessage(event, this)"></textarea></div></div></div>');
		this.container = $("#rooms > #privateRoom_"+this.id);
		$(".application", self.container).corner(chat.cornerType);
		this.chatObj = $("#rooms  > #privateRoom_"+this.id +" .chat");	
		this.textArea = $("#rooms  > #privateRoom_"+this.id +" > textarea");
		
		// load applications
		$(".right .content", this.container).load("/applications/applications.php?lng="+LNG);
		
		this.focused = false;
		
		
		//this.buttonObj.hide();
		chat.flashDataOutputHandler('{"f":"userInfo" , "nickName":"'+nickName+'" }');
		
		
		
	}
	this.reinvited_adjacent=false;
	this.onUserOffline=function(){

		if(INVITER_NICKNAME==this.adjacentNickName && IS_FACEBOOK && this.reinvited_adjacent==false){
			this.reinvited_adjacent=true;

			$.get("/facebook/online_friends.php?friend_uid="+this.adjacentNickName+"&application="+INVITER_APPLICATION+"&reinvite=1&"+getUrlPostfix(), function(data){ $.prompt(data); } );
			chat.closeRoom("private_"+INVITER_NICKNAME);
		}
		
	
	}
	this.historyMessage=function(user, content){
		this.super$sendMessage(content, user, true);
	}
	this.historyIsDisplayed=false;
	this.displayHistory = function(){
		//alert("try display)");
		if(!this.historyIsDisplayed){
			//alert("display)"+this.history.length);
			if(this.history.length>0){
				for(var x=0;x<this.history.length;x++){
					var item = this.history[x];
					if(item.content.substr(0,1)!="/"){
						if(item.toNickName==chat.getMyNickName()){
							this.historyMessage(this.user, item.content);
						}else{
							this.historyMessage(chat.user, item.content);
						}
					}
					
				}
				
				delete this.history;
		
			}
			var obj =this.chatObj;
			obj[0].scrollTop = obj[0].scrollHeight;
			
			this.historyIsDisplayed=true;
			
			this.onHistoryComplete();
		}else{
			//alert("history displayed");
		}
	}
	this.onHistoryComplete=function(){
		
	}
	this.waitListMessage=function(item){
		this.receiveMessage(item);
	}
	this.setUser = function(user){
		
		this.user = user;
		// publish unpublished messages;
		//this.buttonObj.show();
		if(IS_SUPPORT){
			if(getCookie("support_"+( (NETWORK).replace(/\./g, "_")))==this.user.nickName){
				setCookie("talcho_support_user_"+( (NETWORK).replace(/\./g, "_")), this.user.displayName+"|"+this.user.picture, 60*60*3);
		
			}
		
		
		}
		
		
		$("b.tabTitle", this.buttonObj).html(user.displayName);
		
		if(this.historyIsReady){
			//alert("display after user load");
			this.displayHistory();
		}
		
		
		// receive unpublished messages
		for(var x=0;x<this.waitList.length;x++){
			
			this.waitListMessage(this.waitList[x]);
		}
		
		delete this.waitList;
		
		$("h3.userDisplayName",this.container).html(user.displayName);
		if(user.picture.length>5){
			$("div.userPictureContainer",this.container).html('<img src="'+user.picture+'" />');
		}
		
		
		
	}
	
	this.loadApplication = function(name, isServer){
		//alert(isServer);
		var self = this;
		
		if(name==this.applicationName){
			$.prompt(dic("app_already_open"));
			return;
		}
		$(".mode", this.container).addClass("withApplication");
		
		
		$(".application a.close:first", self.container).click(function(){
			self.sendMessage("/app:exit:");
			$(".application .container", self.container).html("");
			$(".mode", self.container).removeClass("withApplication");
			self.applicationObj = null;
			self.applicationName = null;
			//alert("hide)");
			//if(this.adsIsDisplayed){
				//alert("is displayed");
				//this.adsIsDisplayed=false;
				$(".application .centerAdsContainer", self.container).html(' ');
				//alert("removing iframe");
			//}
			return false;
		});
		
		$(".application .container", self.container).html( dic("loading") );
		
		$.getJSON(BASE+"applications/"+name+"/data.php?lng="+LNG, function(json){

			var so = new SWFObject("/applications/"+name+"/app.swf", "user_"+getUserAppId(cEscape(self.adjacentNickName))+"_APP", json.width, "330", "9", "#CCCCCC");
			
			if(isServer){
				//self.sendMessage("/app:app_invite:"+name);
				so.addVariable("serverMode", "true" );
			}else{
				so.addVariable("serverMode", "false" );
			}
			//alert("inviteam 333");
			
			//alert("odpiram");
			
			for(var key in json.dictionary){
				//alert(key+" "+json.dictionary[key])
				so.addVariable("dic_"+json.dictionary[key].c, json.dictionary[key].v);
			}/*/*
			so.addVariable("dic_waiting_adj_user", "Čakam na odziv povabila ..." );
			so.addVariable("dic_adj_quit", "Uporabnik je zapustil igro" );
			so.addVariable("dic_reset", "Nova igra?" );
			so.addVariable("dic_waiting_adj_reset", "Čakam na nasprotnika ..." );
			*/
			so.addVariable("nickName", chat.getMyNickName() );
			so.addVariable("adjacentNickName", self.adjacentNickName );
			so.addVariable("appId", self.id );
			so.addVariable("appName", name );
			
			// opera has problems with transparent mode (flash is not updated when tab is not focused: displayed / visible)
			if($.browser.mozilla){// IE 6 works very slow with transparent wmode
				//so.addParam("wmode","transparent"); // firefox 2 have problems without transparent mode: when i click on flash, i can not write into textarea below
				// TODO: check if everithing is ok now
				// wmode is removed since Firefox 3 has some problems with transparent mode - it was removed - should be checked if it work in FF2
			}
			
			so.write($(".application .container", self.container)[0]);
			
			//self.applicationObj = thisMovie("user_"+self.adjacentNickName+"_APP"); // BUG HERE!!!!!!!!!! if uncommented, it showse blank tab when user chat has not been focused	
			var wasNotFocused = false; // above bug fix
			if(!self.focused){
				wasNotFocused = true;
				self.focus();
			}
			self.applicationObj = $("#user_"+getUserAppId(cEscape(self.adjacentNickName))+"_APP")[0];
			if(wasNotFocused){
				self.blur();
			}
			// end of bug fix
			
			self.applicationName = name;
			
			
			if(ALLOW_ADS && json.width<400){
				this.adsIsDisplayed = true;
				$(".application .centerAdsContainer", self.container).html('<iframe style="border:none" noresize="noresize" frameborder="0" border="0" width="308" height="260" src="/centerAds.php"></iframe>');
			}
			
		}
		);
	}
	
	/* todo remove : this.historyMessage = function(params){
		this.historyWaitList[this.historyWaitList.length]=params;
		
		
	}
	*/
	
	
	
	this.receiveMessage = function(params){
		if(!this.user){ // user data not yet loaded
			this.waitList[this.waitList.length]=params;
			return;
		}
		
		
		
	
		if(params.message.substring(0,5)=="/app:"){
			msg = params.message.substring(5);
			
			//alert(msg.substring(0,18));
			if(msg.substring(0,20)=="app_invite_response:"){
				
				if(chat.allowInviteResponse){
					var app = msg.substring(20);
					
					chat.openApplicationCallback(app, params.nickname);
					
					
					this.loadApplication(app, true);
				}else{
					if(this.chatObj.html()==""){
						//alert("close");
						//this.close(); // if nothing has been writen. Close chat
						chat.closeRoom(this.id);
						
					}
					
				}
				
				
			}else if(msg.substring(0,11)=="app_invite:"){
				var app = msg.substring(11);
				if(app != this.applicationName){
					//alert(app+" "+this.applicationName);
					this.loadApplication(app, false);
				}else{
					// both users are inited
					if(!this.applicationObj){ // fixing bugs with this
						//this.applicationObj = thisMovie("user_"+self.adjacentNickName+"_APP"); 
					}
					this.applicationObj.APPjsToFlash("app_invite:");
					//alert("adjacent is inited");
				}
			}else{
				if(!this.applicationObj){ // fixing bugs with this
					//this.applicationObj = thisMovie("user_"+self.adjacentNickName+"_APP"); 
				}
				this.applicationObj.APPjsToFlash(msg);
				return;
			}
			return; // dont append message
		}
		this.super$receiveMessage(params, this.user);
		
	}
	this.sendMessage = function(msg){
		chat.flashDataOutputHandler('{"f":"privateUserMessage" , "params":{"nickName":"'+this.adjacentNickName+'", "message":"'+chat.safeString(msg)+'"} }');
		if(msg.substring(0,5)=="/app:"){
			// dont  show application message
			return;
		}
		this.super$sendMessage(msg, chat.user);
	}
	
	this.duplicateMessage = function(msg){
		if(msg.substring(0,4)=="/url"){
			return;  // dont show url location
		}
	
		this.super$sendMessage(msg, chat.user);
	}
	
	
	this.setHistory = function(history){
		this.historyIsReady=true;
		this.history = history;
		if(this.user){
			//alert("user is loaded");
			this.displayHistory();
		}
	}



}freeAppId=0;
freeAppIdArray=new Array();
function getUserAppId(escapedNickName){ // nickname is not enough as flash and JS has different escaping
	if(freeAppIdArray[escapedNickName]==null){
		freeAppIdArray[escapedNickName]=freeAppId;
		freeAppId++;
	}
	return freeAppIdArray[escapedNickName];
}

PrivateRoom.prototype = new Room; 
function PrivateRoom(nickName){ 

	this.id = "private_"+cEscape(nickName); 
	this.adjacentNickName = nickName;
	this.urlIdentifier = "user="+this.adjacentNickName;
	this.type="private";
	this.applicationObj = null;
	this.applicationName = null;
	
	var self = this;
	this.adsIsDisplayed = false;
	this.user = null; // adjacent user
	this.waitList = new Array();
	this.history = Array();
	this.historyIsReady=false;
	
	this.init = function(){
		this.tabButton(dic("loading_user"));
		
		
		
		$("#rooms").append('<div id="privateRoom_'+this.id+'" class="room privateRoom"><div class="mode"><div class="application"><a href="#" class="close" onclick="return false"></a><div class="container"></div><div class="centerAdsContainer"></div></div><div class="chat"></div><div class="right"><h3 class="userDisplayName"></h3><div class="userPictureContainer"></div><h3>'+dic("app_list")+'</h3><div class="content"></div></div><div class="textarea_container"><textarea onkeydown="return chat.trySendMessage(event, this)"></textarea></div></div></div>');
		this.container = $("#rooms > #privateRoom_"+this.id);
		$(".application", self.container).corner(chat.cornerType);
		this.chatObj = $("#rooms  > #privateRoom_"+this.id +" .chat");	
		this.textArea = $("#rooms  > #privateRoom_"+this.id +" > textarea");
		
		// load applications
		$(".right .content", this.container).load("/applications/applications.php?lng="+LNG);
		
		this.focused = false;
		
		
		//this.buttonObj.hide();
		chat.flashDataOutputHandler('{"f":"userInfo" , "nickName":"'+nickName+'" }');
		
		
		
	}
	this.reinvited_adjacent=false;
	this.onUserOffline=function(){

		if(INVITER_NICKNAME==this.adjacentNickName && IS_FACEBOOK && this.reinvited_adjacent==false){
			this.reinvited_adjacent=true;

			$.get("/facebook/online_friends.php?friend_uid="+this.adjacentNickName+"&application="+INVITER_APPLICATION+"&reinvite=1&"+getUrlPostfix(), function(data){ $.prompt(data); } );
			chat.closeRoom("private_"+INVITER_NICKNAME);
		}
		
	
	}
	this.historyMessage=function(user, content){
		this.super$sendMessage(content, user, true);
	}
	this.historyIsDisplayed=false;
	this.displayHistory = function(){
		//alert("try display)");
		if(!this.historyIsDisplayed){
			//alert("display)"+this.history.length);
			if(this.history.length>0){
				for(var x=0;x<this.history.length;x++){
					var item = this.history[x];
					if(item.content.substr(0,1)!="/"){
						if(item.toNickName==chat.getMyNickName()){
							this.historyMessage(this.user, item.content);
						}else{
							this.historyMessage(chat.user, item.content);
						}
					}
					
				}
				
				delete this.history;
		
			}
			var obj =this.chatObj;
			obj[0].scrollTop = obj[0].scrollHeight;
			
			this.historyIsDisplayed=true;
			
			this.onHistoryComplete();
		}else{
			//alert("history displayed");
		}
	}
	this.onHistoryComplete=function(){
		
	}
	this.waitListMessage=function(item){
		this.receiveMessage(item);
	}
	this.setUser = function(user){
		
		this.user = user;
		// publish unpublished messages;
		//this.buttonObj.show();
		if(IS_SUPPORT){
			if(getCookie("support_"+( (NETWORK).replace(/\./g, "_")))==this.user.nickName){
				setCookie("talcho_support_user_"+( (NETWORK).replace(/\./g, "_")), this.user.displayName+"|"+this.user.picture, 60*60*3);
		
			}
		
		
		}
		
		
		$("b.tabTitle", this.buttonObj).html(user.displayName);
		
		if(this.historyIsReady){
			//alert("display after user load");
			this.displayHistory();
		}
		
		
		// receive unpublished messages
		for(var x=0;x<this.waitList.length;x++){
			
			this.waitListMessage(this.waitList[x]);
		}
		
		delete this.waitList;
		
		$("h3.userDisplayName",this.container).html(user.displayName);
		if(user.picture.length>5){
			$("div.userPictureContainer",this.container).html('<img src="'+user.picture+'" />');
		}
		
		
		
	}
	
	this.loadApplication = function(name, isServer){
		//alert(isServer);
		var self = this;
		
		if(name==this.applicationName){
			$.prompt(dic("app_already_open"));
			return;
		}
		$(".mode", this.container).addClass("withApplication");
		
		
		$(".application a.close:first", self.container).click(function(){
			self.sendMessage("/app:exit:");
			$(".application .container", self.container).html("");
			$(".mode", self.container).removeClass("withApplication");
			self.applicationObj = null;
			self.applicationName = null;
			//alert("hide)");
			//if(this.adsIsDisplayed){
				//alert("is displayed");
				//this.adsIsDisplayed=false;
				$(".application .centerAdsContainer", self.container).html(' ');
				//alert("removing iframe");
			//}
			return false;
		});
		
		$(".application .container", self.container).html( dic("loading") );
		
		$.getJSON(BASE+"applications/"+name+"/data.php?lng="+LNG, function(json){

			var so = new SWFObject("/applications/"+name+"/app.swf", "user_"+getUserAppId(cEscape(self.adjacentNickName))+"_APP", json.width, "330", "9", "#CCCCCC");
			
			if(isServer){
				//self.sendMessage("/app:app_invite:"+name);
				so.addVariable("serverMode", "true" );
			}else{
				so.addVariable("serverMode", "false" );
			}
			//alert("inviteam 333");
			
			//alert("odpiram");
			
			for(var key in json.dictionary){
				//alert(key+" "+json.dictionary[key])
				so.addVariable("dic_"+json.dictionary[key].c, json.dictionary[key].v);
			}/*/*
			so.addVariable("dic_waiting_adj_user", "Čakam na odziv povabila ..." );
			so.addVariable("dic_adj_quit", "Uporabnik je zapustil igro" );
			so.addVariable("dic_reset", "Nova igra?" );
			so.addVariable("dic_waiting_adj_reset", "Čakam na nasprotnika ..." );
			*/
			so.addVariable("nickName", chat.getMyNickName() );
			so.addVariable("adjacentNickName", self.adjacentNickName );
			so.addVariable("appId", self.id );
			so.addVariable("appName", name );
			
			// opera has problems with transparent mode (flash is not updated when tab is not focused: displayed / visible)
			if($.browser.mozilla){// IE 6 works very slow with transparent wmode
				//so.addParam("wmode","transparent"); // firefox 2 have problems without transparent mode: when i click on flash, i can not write into textarea below
				// TODO: check if everithing is ok now
				// wmode is removed since Firefox 3 has some problems with transparent mode - it was removed - should be checked if it work in FF2
			}
			
			so.write($(".application .container", self.container)[0]);
			
			//self.applicationObj = thisMovie("user_"+self.adjacentNickName+"_APP"); // BUG HERE!!!!!!!!!! if uncommented, it showse blank tab when user chat has not been focused	
			var wasNotFocused = false; // above bug fix
			if(!self.focused){
				wasNotFocused = true;
				self.focus();
			}
			self.applicationObj = $("#user_"+getUserAppId(cEscape(self.adjacentNickName))+"_APP")[0];
			if(wasNotFocused){
				self.blur();
			}
			// end of bug fix
			
			self.applicationName = name;
			
			
			if(ALLOW_ADS && json.width<400){
				this.adsIsDisplayed = true;
				$(".application .centerAdsContainer", self.container).html('<iframe style="border:none" noresize="noresize" frameborder="0" border="0" width="308" height="260" src="/centerAds.php"></iframe>');
			}
			
		}
		);
	}
	
	/* todo remove : this.historyMessage = function(params){
		this.historyWaitList[this.historyWaitList.length]=params;
		
		
	}
	*/
	
	
	
	this.receiveMessage = function(params){
		if(!this.user){ // user data not yet loaded
			this.waitList[this.waitList.length]=params;
			return;
		}
		
		
		
	
		if(params.message.substring(0,5)=="/app:"){
			msg = params.message.substring(5);
			
			//alert(msg.substring(0,18));
			if(msg.substring(0,20)=="app_invite_response:"){
				
				if(chat.allowInviteResponse){
					var app = msg.substring(20);
					
					chat.openApplicationCallback(app, params.nickname);
					
					
					this.loadApplication(app, true);
				}else{
					if(this.chatObj.html()==""){
						//alert("close");
						//this.close(); // if nothing has been writen. Close chat
						chat.closeRoom(this.id);
						
					}
					
				}
				
				
			}else if(msg.substring(0,11)=="app_invite:"){
				var app = msg.substring(11);
				if(app != this.applicationName){
					//alert(app+" "+this.applicationName);
					this.loadApplication(app, false);
				}else{
					// both users are inited
					if(!this.applicationObj){ // fixing bugs with this
						//this.applicationObj = thisMovie("user_"+self.adjacentNickName+"_APP"); 
					}
					this.applicationObj.APPjsToFlash("app_invite:");
					//alert("adjacent is inited");
				}
			}else{
				if(!this.applicationObj){ // fixing bugs with this
					//this.applicationObj = thisMovie("user_"+self.adjacentNickName+"_APP"); 
				}
				this.applicationObj.APPjsToFlash(msg);
				return;
			}
			return; // dont append message
		}
		this.super$receiveMessage(params, this.user);
		
	}
	this.sendMessage = function(msg){
		chat.flashDataOutputHandler('{"f":"privateUserMessage" , "params":{"nickName":"'+this.adjacentNickName+'", "message":"'+chat.safeString(msg)+'"} }');
		if(msg.substring(0,5)=="/app:"){
			// dont  show application message
			return;
		}
		this.super$sendMessage(msg, chat.user);
	}
	
	this.duplicateMessage = function(msg){
		if(msg.substring(0,4)=="/url"){
			return;  // dont show url location
		}
	
		this.super$sendMessage(msg, chat.user);
	}
	
	
	this.setHistory = function(history){
		this.historyIsReady=true;
		this.history = history;
		if(this.user){
			//alert("user is loaded");
			this.displayHistory();
		}
	}



}function FriendRoom(){
	this.id = "friendRoom"; 
	this.type="friendRoom";
	//this.appendMessage = appendMessage;
	this.init = init;
	
	this.focused = true;
	
	this.focus = focus;   // focus this chat
	this.blur = blur; // unfocus
	
	this.changeUserStatus = changeUserStatus;
	
	function init(){
		
		// append button 
		//$("#buttons").append('<h3 id="roomB_S" class="fucused" onclick="chat.focusRoom(\''+this.id+'\'); return false;"><b>Sys</b></h3> ');
		//var button = $("#buttons > #roomB_S");
		// append room HTML
		//$("#rooms").append('<div id="systemRoom" class="room SystemRoom"><div class="chat" id="systemMessages"></div></div>');
		//var roomContainer = null;
		//var roomChat = $("#rooms  > #systemRoom > .chat");	
		
		//alert(button);	
		
	}
	function changeUserStatus(userId, statusId){
		$("#friendUsers > .friend_"+userId+"_info > a > .status > span").attr("class", statusArray[parseInt(statusId)]);
	}
	function focus(){

	}
	function blur(){

	}
	this.disable=function(){
		$("#friendUsers").empty();
	}
	this.enable=function(){
	
	}

}/*
 * jQuery corner plugin
 *
 * version 1.92 (12/18/2007)
 *
 * Dual licensed under the MIT and GPL licenses:
 *   http://www.opensource.org/licenses/mit-license.php
 *   http://www.gnu.org/licenses/gpl.html
 */

/**
 * The corner() method provides a simple way of styling DOM elements.  
 *
 * corner() takes a single string argument:  $().corner("effect corners width")
 *
 *   effect:  The name of the effect to apply, such as round or bevel. 
 *            If you don't specify an effect, rounding is used.
 *
 *   corners: The corners can be one or more of top, bottom, tr, tl, br, or bl. 
 *            By default, all four corners are adorned. 
 *
 *   width:   The width specifies the width of the effect; in the case of rounded corners this 
 *            will be the radius of the width. 
 *            Specify this value using the px suffix such as 10px, and yes it must be pixels.
 *
 * For more details see: http://methvin.com/jquery/jq-corner.html
 * For a full demo see:  http://malsup.com/jquery/corner/
 *
 *
 * @example $('.adorn').corner();
 * @desc Create round, 10px corners 
 *
 * @example $('.adorn').corner("25px");
 * @desc Create round, 25px corners 
 *
 * @example $('.adorn').corner("notch bottom");
 * @desc Create notched, 10px corners on bottom only
 *
 * @example $('.adorn').corner("tr dog 25px");
 * @desc Create dogeared, 25px corner on the top-right corner only
 *
 * @example $('.adorn').corner("round 8px").parent().css('padding', '4px').corner("round 10px");
 * @desc Create a rounded border effect by styling both the element and its parent
 * 
 * @name corner
 * @type jQuery
 * @param String options Options which control the corner style
 * @cat Plugins/Corner
 * @return jQuery
 * @author Dave Methvin (dave.methvin@gmail.com)
 * @author Mike Alsup (malsup@gmail.com)
 */
(function($) { 

$.fn.corner = function(o) {
    var ie6 = $.browser.msie && /MSIE 6.0/.test(navigator.userAgent);
    function sz(el, p) { return parseInt($.css(el,p))||0; };
    function hex2(s) {
        var s = parseInt(s).toString(16);
        return ( s.length < 2 ) ? '0'+s : s;
    };
    function gpc(node) {
        for ( ; node && node.nodeName.toLowerCase() != 'html'; node = node.parentNode ) {
            var v = $.css(node,'backgroundColor');
            if ( v.indexOf('rgb') >= 0 ) { 
                if ($.browser.safari && v == 'rgba(0, 0, 0, 0)')
                    continue;
                var rgb = v.match(/\d+/g); 
                return '#'+ hex2(rgb[0]) + hex2(rgb[1]) + hex2(rgb[2]);
            }
            if ( v && v != 'transparent' )
                return v;
        }
        return '#ffffff';
    };
    function getW(i) {
        switch(fx) {
        case 'round':  return Math.round(width*(1-Math.cos(Math.asin(i/width))));
        case 'cool':   return Math.round(width*(1+Math.cos(Math.asin(i/width))));
        case 'sharp':  return Math.round(width*(1-Math.cos(Math.acos(i/width))));
        case 'bite':   return Math.round(width*(Math.cos(Math.asin((width-i-1)/width))));
        case 'slide':  return Math.round(width*(Math.atan2(i,width/i)));
        case 'jut':    return Math.round(width*(Math.atan2(width,(width-i-1))));
        case 'curl':   return Math.round(width*(Math.atan(i)));
        case 'tear':   return Math.round(width*(Math.cos(i)));
        case 'wicked': return Math.round(width*(Math.tan(i)));
        case 'long':   return Math.round(width*(Math.sqrt(i)));
        case 'sculpt': return Math.round(width*(Math.log((width-i-1),width)));
        case 'dog':    return (i&1) ? (i+1) : width;
        case 'dog2':   return (i&2) ? (i+1) : width;
        case 'dog3':   return (i&3) ? (i+1) : width;
        case 'fray':   return (i%2)*width;
        case 'notch':  return width; 
        case 'bevel':  return i+1;
        }
    };
    o = (o||"").toLowerCase();
    var keep = /keep/.test(o);                       // keep borders?
    var cc = ((o.match(/cc:(#[0-9a-f]+)/)||[])[1]);  // corner color
    var sc = ((o.match(/sc:(#[0-9a-f]+)/)||[])[1]);  // strip color
    var width = parseInt((o.match(/(\d+)px/)||[])[1]) || 10; // corner width
    var re = /round|bevel|notch|bite|cool|sharp|slide|jut|curl|tear|fray|wicked|sculpt|long|dog3|dog2|dog/;
    var fx = ((o.match(re)||['round'])[0]);
    var edges = { T:0, B:1 };
    var opts = {
        TL:  /top|tl/.test(o),       TR:  /top|tr/.test(o),
        BL:  /bottom|bl/.test(o),    BR:  /bottom|br/.test(o)
    };
    if ( !opts.TL && !opts.TR && !opts.BL && !opts.BR )
        opts = { TL:1, TR:1, BL:1, BR:1 };
    var strip = document.createElement('div');
    strip.style.overflow = 'hidden';
    strip.style.height = '1px';
    strip.style.backgroundColor = sc || 'transparent';
    strip.style.borderStyle = 'solid';
    return this.each(function(index){
        var pad = {
            T: parseInt($.css(this,'paddingTop'))||0,     R: parseInt($.css(this,'paddingRight'))||0,
            B: parseInt($.css(this,'paddingBottom'))||0,  L: parseInt($.css(this,'paddingLeft'))||0
        };

        if ($.browser.msie) this.style.zoom = 1; // force 'hasLayout' in IE
        if (!keep) this.style.border = 'none';
        strip.style.borderColor = cc || gpc(this.parentNode);
        var cssHeight = $.curCSS(this, 'height');

        for (var j in edges) {
            var bot = edges[j];
            // only add stips if needed
            if ((bot && (opts.BL || opts.BR)) || (!bot && (opts.TL || opts.TR))) {
                strip.style.borderStyle = 'none '+(opts[j+'R']?'solid':'none')+' none '+(opts[j+'L']?'solid':'none');
                var d = document.createElement('div');
                $(d).addClass('jquery-corner');
                var ds = d.style;

                bot ? this.appendChild(d) : this.insertBefore(d, this.firstChild);

                if (bot && cssHeight != 'auto') {
                    if ($.css(this,'position') == 'static')
                        this.style.position = 'relative';
                    ds.position = 'absolute';
                    ds.bottom = ds.left = ds.padding = ds.margin = '0';
                    if ($.browser.msie)
                        ds.setExpression('width', 'this.parentNode.offsetWidth');
                    else
                        ds.width = '100%';
                }
                else if (!bot && $.browser.msie) {
                    if ($.css(this,'position') == 'static')
                        this.style.position = 'relative';
                    ds.position = 'absolute';
                    ds.top = ds.left = ds.right = ds.padding = ds.margin = '0';
                    
                    // fix ie6 problem when blocked element has a border width
                    var bw = 0;
                    if (ie6 || !$.boxModel)
                        bw = sz(this,'borderLeftWidth') + sz(this,'borderRightWidth');
                    ie6 ? ds.setExpression('width', 'this.parentNode.offsetWidth - '+bw+'+ "px"') : ds.width = '100%';
                }
                else {
                    ds.margin = !bot ? '-'+pad.T+'px -'+pad.R+'px '+(pad.T-width)+'px -'+pad.L+'px' : 
                                        (pad.B-width)+'px -'+pad.R+'px -'+pad.B+'px -'+pad.L+'px';                
                }

                for (var i=0; i < width; i++) {
                    var w = Math.max(0,getW(i));
                    var e = strip.cloneNode(false);
                    e.style.borderWidth = '0 '+(opts[j+'R']?w:0)+'px 0 '+(opts[j+'L']?w:0)+'px';
                    bot ? d.appendChild(e) : d.insertBefore(e, d.firstChild);
                }
            }
        }
    });
};

$.fn.uncorner = function(o) { return $('.jquery-corner', this).remove(); };
    
})(jQuery);
SystemRoom.prototype = new Room; 
function SystemRoom(){
	this.id = "system"; 
	this.type="system";
	this.appendMessage = appendMessage;
	this.init = init;
	this.focus = focus;   // focus this chat
	this.blur = blur; // unfocus
	
	function init(){
		
		// append button 
		//$("#buttons").append('<h3 id="roomB_S" class="fucused" onclick="chat.focusRoom(\''+this.id+'\'); return false;"><b>Sys</b></h3> ');
		//var button = $("#buttons > #roomB_S");
		
		this.tabButton("SYS");
		
		// append room HTML
		$("#rooms").append('<div id="systemRoom" class="room SystemRoom"><div class="chat" id="systemMessages"></div></div>');
		var roomContainer = $("#rooms > #systemRoom");
		var roomChat = $("#rooms  > #systemRoom > .chat");	
		
		//alert(button);
		//this.buttonObj = button;
		this.container = roomContainer;
		this.chatObj = roomChat;
		//this.usersObj = roomUsers;
		this.focused = false;
		
		
		this.focus();
	}
	function sendMessage(msg){
		//alert("poslal bom msg za "+this.friendUserId);
		chat.flashDataOutputHandler('{"function":"privateUserMessage" , "params":{"userId":"'+this.friendUserId+'", "message":"'+msg+'"} }');
		//alert("sporocilo poslano");
		var userId = chat.userId;
		this.chatObj.append("<div class='msg"+userId+"'><a href='index.php?uid="+userId+"' onclick=\"chat.openPrivateRoom("+userId+"); return false\"'>"+chat.userName+"</a>: "+msg+"</div>");
	}
	function appendMessage(code, message){
		this.chatObj.append("<div class='msg'>"+code+"</div>");
	
	}
	function focus(){
		this.container.css("visibility","visible"); // .show() doesnt work in IE6
		this.buttonObj.addClass("focused");
		this.buttonObj.removeClass("newMessage");
		this.focused = true;
	//	document.location.href="#systemRoom=true";
	}
	function blur(){
		this.container.css("visibility","hidden");
		this.buttonObj.removeClass("focused");
		this.focused = false;
	}
	this.disable=function(){
	
	}
	this.enable=function(){
	
	}

}/*
 * jQuery corner plugin
 *
 * version 1.92 (12/18/2007)
 *
 * Dual licensed under the MIT and GPL licenses:
 *   http://www.opensource.org/licenses/mit-license.php
 *   http://www.gnu.org/licenses/gpl.html
 */

/**
 * The corner() method provides a simple way of styling DOM elements.  
 *
 * corner() takes a single string argument:  $().corner("effect corners width")
 *
 *   effect:  The name of the effect to apply, such as round or bevel. 
 *            If you don't specify an effect, rounding is used.
 *
 *   corners: The corners can be one or more of top, bottom, tr, tl, br, or bl. 
 *            By default, all four corners are adorned. 
 *
 *   width:   The width specifies the width of the effect; in the case of rounded corners this 
 *            will be the radius of the width. 
 *            Specify this value using the px suffix such as 10px, and yes it must be pixels.
 *
 * For more details see: http://methvin.com/jquery/jq-corner.html
 * For a full demo see:  http://malsup.com/jquery/corner/
 *
 *
 * @example $('.adorn').corner();
 * @desc Create round, 10px corners 
 *
 * @example $('.adorn').corner("25px");
 * @desc Create round, 25px corners 
 *
 * @example $('.adorn').corner("notch bottom");
 * @desc Create notched, 10px corners on bottom only
 *
 * @example $('.adorn').corner("tr dog 25px");
 * @desc Create dogeared, 25px corner on the top-right corner only
 *
 * @example $('.adorn').corner("round 8px").parent().css('padding', '4px').corner("round 10px");
 * @desc Create a rounded border effect by styling both the element and its parent
 * 
 * @name corner
 * @type jQuery
 * @param String options Options which control the corner style
 * @cat Plugins/Corner
 * @return jQuery
 * @author Dave Methvin (dave.methvin@gmail.com)
 * @author Mike Alsup (malsup@gmail.com)
 */
(function($) { 

$.fn.corner = function(o) {
    var ie6 = $.browser.msie && /MSIE 6.0/.test(navigator.userAgent);
    function sz(el, p) { return parseInt($.css(el,p))||0; };
    function hex2(s) {
        var s = parseInt(s).toString(16);
        return ( s.length < 2 ) ? '0'+s : s;
    };
    function gpc(node) {
        for ( ; node && node.nodeName.toLowerCase() != 'html'; node = node.parentNode ) {
            var v = $.css(node,'backgroundColor');
            if ( v.indexOf('rgb') >= 0 ) { 
                if ($.browser.safari && v == 'rgba(0, 0, 0, 0)')
                    continue;
                var rgb = v.match(/\d+/g); 
                return '#'+ hex2(rgb[0]) + hex2(rgb[1]) + hex2(rgb[2]);
            }
            if ( v && v != 'transparent' )
                return v;
        }
        return '#ffffff';
    };
    function getW(i) {
        switch(fx) {
        case 'round':  return Math.round(width*(1-Math.cos(Math.asin(i/width))));
        case 'cool':   return Math.round(width*(1+Math.cos(Math.asin(i/width))));
        case 'sharp':  return Math.round(width*(1-Math.cos(Math.acos(i/width))));
        case 'bite':   return Math.round(width*(Math.cos(Math.asin((width-i-1)/width))));
        case 'slide':  return Math.round(width*(Math.atan2(i,width/i)));
        case 'jut':    return Math.round(width*(Math.atan2(width,(width-i-1))));
        case 'curl':   return Math.round(width*(Math.atan(i)));
        case 'tear':   return Math.round(width*(Math.cos(i)));
        case 'wicked': return Math.round(width*(Math.tan(i)));
        case 'long':   return Math.round(width*(Math.sqrt(i)));
        case 'sculpt': return Math.round(width*(Math.log((width-i-1),width)));
        case 'dog':    return (i&1) ? (i+1) : width;
        case 'dog2':   return (i&2) ? (i+1) : width;
        case 'dog3':   return (i&3) ? (i+1) : width;
        case 'fray':   return (i%2)*width;
        case 'notch':  return width; 
        case 'bevel':  return i+1;
        }
    };
    o = (o||"").toLowerCase();
    var keep = /keep/.test(o);                       // keep borders?
    var cc = ((o.match(/cc:(#[0-9a-f]+)/)||[])[1]);  // corner color
    var sc = ((o.match(/sc:(#[0-9a-f]+)/)||[])[1]);  // strip color
    var width = parseInt((o.match(/(\d+)px/)||[])[1]) || 10; // corner width
    var re = /round|bevel|notch|bite|cool|sharp|slide|jut|curl|tear|fray|wicked|sculpt|long|dog3|dog2|dog/;
    var fx = ((o.match(re)||['round'])[0]);
    var edges = { T:0, B:1 };
    var opts = {
        TL:  /top|tl/.test(o),       TR:  /top|tr/.test(o),
        BL:  /bottom|bl/.test(o),    BR:  /bottom|br/.test(o)
    };
    if ( !opts.TL && !opts.TR && !opts.BL && !opts.BR )
        opts = { TL:1, TR:1, BL:1, BR:1 };
    var strip = document.createElement('div');
    strip.style.overflow = 'hidden';
    strip.style.height = '1px';
    strip.style.backgroundColor = sc || 'transparent';
    strip.style.borderStyle = 'solid';
    return this.each(function(index){
        var pad = {
            T: parseInt($.css(this,'paddingTop'))||0,     R: parseInt($.css(this,'paddingRight'))||0,
            B: parseInt($.css(this,'paddingBottom'))||0,  L: parseInt($.css(this,'paddingLeft'))||0
        };

        if ($.browser.msie) this.style.zoom = 1; // force 'hasLayout' in IE
        if (!keep) this.style.border = 'none';
        strip.style.borderColor = cc || gpc(this.parentNode);
        var cssHeight = $.curCSS(this, 'height');

        for (var j in edges) {
            var bot = edges[j];
            // only add stips if needed
            if ((bot && (opts.BL || opts.BR)) || (!bot && (opts.TL || opts.TR))) {
                strip.style.borderStyle = 'none '+(opts[j+'R']?'solid':'none')+' none '+(opts[j+'L']?'solid':'none');
                var d = document.createElement('div');
                $(d).addClass('jquery-corner');
                var ds = d.style;

                bot ? this.appendChild(d) : this.insertBefore(d, this.firstChild);

                if (bot && cssHeight != 'auto') {
                    if ($.css(this,'position') == 'static')
                        this.style.position = 'relative';
                    ds.position = 'absolute';
                    ds.bottom = ds.left = ds.padding = ds.margin = '0';
                    if ($.browser.msie)
                        ds.setExpression('width', 'this.parentNode.offsetWidth');
                    else
                        ds.width = '100%';
                }
                else if (!bot && $.browser.msie) {
                    if ($.css(this,'position') == 'static')
                        this.style.position = 'relative';
                    ds.position = 'absolute';
                    ds.top = ds.left = ds.right = ds.padding = ds.margin = '0';
                    
                    // fix ie6 problem when blocked element has a border width
                    var bw = 0;
                    if (ie6 || !$.boxModel)
                        bw = sz(this,'borderLeftWidth') + sz(this,'borderRightWidth');
                    ie6 ? ds.setExpression('width', 'this.parentNode.offsetWidth - '+bw+'+ "px"') : ds.width = '100%';
                }
                else {
                    ds.margin = !bot ? '-'+pad.T+'px -'+pad.R+'px '+(pad.T-width)+'px -'+pad.L+'px' : 
                                        (pad.B-width)+'px -'+pad.R+'px -'+pad.B+'px -'+pad.L+'px';                
                }

                for (var i=0; i < width; i++) {
                    var w = Math.max(0,getW(i));
                    var e = strip.cloneNode(false);
                    e.style.borderWidth = '0 '+(opts[j+'R']?w:0)+'px 0 '+(opts[j+'L']?w:0)+'px';
                    bot ? d.appendChild(e) : d.insertBefore(e, d.firstChild);
                }
            }
        }
    });
};

$.fn.uncorner = function(o) { return $('.jquery-corner', this).remove(); };
    
})(jQuery);
/*
 * jQuery corner plugin
 *
 * version 1.92 (12/18/2007)
 *
 * Dual licensed under the MIT and GPL licenses:
 *   http://www.opensource.org/licenses/mit-license.php
 *   http://www.gnu.org/licenses/gpl.html
 */

/**
 * The corner() method provides a simple way of styling DOM elements.  
 *
 * corner() takes a single string argument:  $().corner("effect corners width")
 *
 *   effect:  The name of the effect to apply, such as round or bevel. 
 *            If you don't specify an effect, rounding is used.
 *
 *   corners: The corners can be one or more of top, bottom, tr, tl, br, or bl. 
 *            By default, all four corners are adorned. 
 *
 *   width:   The width specifies the width of the effect; in the case of rounded corners this 
 *            will be the radius of the width. 
 *            Specify this value using the px suffix such as 10px, and yes it must be pixels.
 *
 * For more details see: http://methvin.com/jquery/jq-corner.html
 * For a full demo see:  http://malsup.com/jquery/corner/
 *
 *
 * @example $('.adorn').corner();
 * @desc Create round, 10px corners 
 *
 * @example $('.adorn').corner("25px");
 * @desc Create round, 25px corners 
 *
 * @example $('.adorn').corner("notch bottom");
 * @desc Create notched, 10px corners on bottom only
 *
 * @example $('.adorn').corner("tr dog 25px");
 * @desc Create dogeared, 25px corner on the top-right corner only
 *
 * @example $('.adorn').corner("round 8px").parent().css('padding', '4px').corner("round 10px");
 * @desc Create a rounded border effect by styling both the element and its parent
 * 
 * @name corner
 * @type jQuery
 * @param String options Options which control the corner style
 * @cat Plugins/Corner
 * @return jQuery
 * @author Dave Methvin (dave.methvin@gmail.com)
 * @author Mike Alsup (malsup@gmail.com)
 */
(function($) { 

$.fn.corner = function(o) {
    var ie6 = $.browser.msie && /MSIE 6.0/.test(navigator.userAgent);
    function sz(el, p) { return parseInt($.css(el,p))||0; };
    function hex2(s) {
        var s = parseInt(s).toString(16);
        return ( s.length < 2 ) ? '0'+s : s;
    };
    function gpc(node) {
        for ( ; node && node.nodeName.toLowerCase() != 'html'; node = node.parentNode ) {
            var v = $.css(node,'backgroundColor');
            if ( v.indexOf('rgb') >= 0 ) { 
                if ($.browser.safari && v == 'rgba(0, 0, 0, 0)')
                    continue;
                var rgb = v.match(/\d+/g); 
                return '#'+ hex2(rgb[0]) + hex2(rgb[1]) + hex2(rgb[2]);
            }
            if ( v && v != 'transparent' )
                return v;
        }
        return '#ffffff';
    };
    function getW(i) {
        switch(fx) {
        case 'round':  return Math.round(width*(1-Math.cos(Math.asin(i/width))));
        case 'cool':   return Math.round(width*(1+Math.cos(Math.asin(i/width))));
        case 'sharp':  return Math.round(width*(1-Math.cos(Math.acos(i/width))));
        case 'bite':   return Math.round(width*(Math.cos(Math.asin((width-i-1)/width))));
        case 'slide':  return Math.round(width*(Math.atan2(i,width/i)));
        case 'jut':    return Math.round(width*(Math.atan2(width,(width-i-1))));
        case 'curl':   return Math.round(width*(Math.atan(i)));
        case 'tear':   return Math.round(width*(Math.cos(i)));
        case 'wicked': return Math.round(width*(Math.tan(i)));
        case 'long':   return Math.round(width*(Math.sqrt(i)));
        case 'sculpt': return Math.round(width*(Math.log((width-i-1),width)));
        case 'dog':    return (i&1) ? (i+1) : width;
        case 'dog2':   return (i&2) ? (i+1) : width;
        case 'dog3':   return (i&3) ? (i+1) : width;
        case 'fray':   return (i%2)*width;
        case 'notch':  return width; 
        case 'bevel':  return i+1;
        }
    };
    o = (o||"").toLowerCase();
    var keep = /keep/.test(o);                       // keep borders?
    var cc = ((o.match(/cc:(#[0-9a-f]+)/)||[])[1]);  // corner color
    var sc = ((o.match(/sc:(#[0-9a-f]+)/)||[])[1]);  // strip color
    var width = parseInt((o.match(/(\d+)px/)||[])[1]) || 10; // corner width
    var re = /round|bevel|notch|bite|cool|sharp|slide|jut|curl|tear|fray|wicked|sculpt|long|dog3|dog2|dog/;
    var fx = ((o.match(re)||['round'])[0]);
    var edges = { T:0, B:1 };
    var opts = {
        TL:  /top|tl/.test(o),       TR:  /top|tr/.test(o),
        BL:  /bottom|bl/.test(o),    BR:  /bottom|br/.test(o)
    };
    if ( !opts.TL && !opts.TR && !opts.BL && !opts.BR )
        opts = { TL:1, TR:1, BL:1, BR:1 };
    var strip = document.createElement('div');
    strip.style.overflow = 'hidden';
    strip.style.height = '1px';
    strip.style.backgroundColor = sc || 'transparent';
    strip.style.borderStyle = 'solid';
    return this.each(function(index){
        var pad = {
            T: parseInt($.css(this,'paddingTop'))||0,     R: parseInt($.css(this,'paddingRight'))||0,
            B: parseInt($.css(this,'paddingBottom'))||0,  L: parseInt($.css(this,'paddingLeft'))||0
        };

        if ($.browser.msie) this.style.zoom = 1; // force 'hasLayout' in IE
        if (!keep) this.style.border = 'none';
        strip.style.borderColor = cc || gpc(this.parentNode);
        var cssHeight = $.curCSS(this, 'height');

        for (var j in edges) {
            var bot = edges[j];
            // only add stips if needed
            if ((bot && (opts.BL || opts.BR)) || (!bot && (opts.TL || opts.TR))) {
                strip.style.borderStyle = 'none '+(opts[j+'R']?'solid':'none')+' none '+(opts[j+'L']?'solid':'none');
                var d = document.createElement('div');
                $(d).addClass('jquery-corner');
                var ds = d.style;

                bot ? this.appendChild(d) : this.insertBefore(d, this.firstChild);

                if (bot && cssHeight != 'auto') {
                    if ($.css(this,'position') == 'static')
                        this.style.position = 'relative';
                    ds.position = 'absolute';
                    ds.bottom = ds.left = ds.padding = ds.margin = '0';
                    if ($.browser.msie)
                        ds.setExpression('width', 'this.parentNode.offsetWidth');
                    else
                        ds.width = '100%';
                }
                else if (!bot && $.browser.msie) {
                    if ($.css(this,'position') == 'static')
                        this.style.position = 'relative';
                    ds.position = 'absolute';
                    ds.top = ds.left = ds.right = ds.padding = ds.margin = '0';
                    
                    // fix ie6 problem when blocked element has a border width
                    var bw = 0;
                    if (ie6 || !$.boxModel)
                        bw = sz(this,'borderLeftWidth') + sz(this,'borderRightWidth');
                    ie6 ? ds.setExpression('width', 'this.parentNode.offsetWidth - '+bw+'+ "px"') : ds.width = '100%';
                }
                else {
                    ds.margin = !bot ? '-'+pad.T+'px -'+pad.R+'px '+(pad.T-width)+'px -'+pad.L+'px' : 
                                        (pad.B-width)+'px -'+pad.R+'px -'+pad.B+'px -'+pad.L+'px';                
                }

                for (var i=0; i < width; i++) {
                    var w = Math.max(0,getW(i));
                    var e = strip.cloneNode(false);
                    e.style.borderWidth = '0 '+(opts[j+'R']?w:0)+'px 0 '+(opts[j+'L']?w:0)+'px';
                    bot ? d.appendChild(e) : d.insertBefore(e, d.firstChild);
                }
            }
        }
    });
};

$.fn.uncorner = function(o) { return $('.jquery-corner', this).remove(); };
    
})(jQuery);
GameRoom.prototype = new Room; 
function GameRoom(){ 

	this.id = "game_room"; 
	this.urlIdentifier = "games";
	this.type="game_room";
	var self = this;
	this.adsIsDisplayed = false;
	this.usersContainer=null;
	this.gameNavigationContainer=null;
	self = this;
	
	this.roomArray=new Array();
	this.roomByGameArray=new Array();
	this.userArray=new Array();
	this.gameArray=new Array();

	this.init = function(){
		this.tabButton(dic("game_room"));
		
		
		//$("a.close", this.buttonObj).remove(); // hide close Button
		
		
		$("#rooms").append('<div id="'+this.id+'"><div id="game_navigation"><h3>'+dic("invite_others_to_play")+'</h3><div class="links"></div></div><ul id="game_users"></ul></div>');
		
		
		this.container = $("#rooms > #"+this.id);
		this.focused = false;
		
		this.gameNavigationContainer=$("#game_navigation", this.container);
		this.usersContainer=$("#game_users", this.container);
		
		
		
		$.getJSON("/applications/applications.php?returnJSON=1&lng="+LNG, function(json){
			
			
			
			for(var x=0; x<json.applications.length;x++){
				var item = json.applications[x];
				
				self.gameArray[item.id]={"title":item.title, "id":item.id, "users":[],"room":item.room};
				//alert("set");
				self.roomArray[item.room]={"game":item.id};
				self.roomByGameArray[item.id]=item.room;
				
				
				var a=$('<a href="#" class="submit"><img src="/applications/'+item.id+'/icon.gif" />'+item.title+'</a> ').appendTo($(".links", self.gameNavigationContainer));
				
				
				eval('a.click(function(){	self.gameRequest("'+item.id+'"); });');
				
				
				chat.joinPublicRoom(item.room);
			}
			
		
		});
		
		
	}
	this.disable=function(){
		this.usersContainer.html("");
	}
	this.enable=function(){
		for(var key in this.roomByGameArray){
			chat.joinPublicRoom(this.roomByGameArray[key]);
		}
	}
	this.close=function(){
		for(var key in this.gameArray){
			JSON = '{"f":"leavePublicRoom", "params":{"room":"'+this.gameArray[key].room+'"} }';
			chat.flashDataOutputHandler(JSON);
		}	
	}
	
	
	
	//this.gameUserArray=new Array();
	
	
	this.parse=function(data){
		var params=data.params;
		var room = params.room;
		switch(data.f){
			case "changeUserCrown":
				var crown = parseInt(params.crown);
				if(crown==4){
					this.newMessage();
					this.addUser(this.userArray[cEscape(params.nickName)], this.roomArray[room].game);
				}else if(crown==1){
					this.removeUser(params.nickName, this.roomArray[room].game);
				}
			break;
			case "joinPublicRoom":
				
				this.userArray[cEscape(params.user.nickName)]=params.user;
				//alert(params.user.crown);
				if(parseInt(params.user.crown)==4){
					//alert("dodajam);
					this.addUser(params.user, this.roomArray[room].game);
				}
			
			
			break;
			case "leavePublicRoom":
			var game = this.roomArray[room].game;
			this.removeUser(params.nickName, game);
			// TODO: should also delete user
			
			break;
			case "defineRoom": // is set on JSON load
			//alert("define room");
			//this.roomArray[params.room]={game:params.topic};
			//this.roomByGameArray[params.topic]=params.room;
			//alert(params.users.length);
			for(var x=0; x<params.users.length;x++){
				
				if(parseInt(params.users[x].crown)==4){
					this.addUser(params.users[x],this.roomArray[room].game);
				}
				
			}
			//alert("dodali smo vse");
			
			break;
		
		}
	
	}
	this.addUser=function(user, game){
		
		
		this.userArray[cEscape(user.nickName)]=user; // add user to user array
		
		if(!this.gameArray[game].users[cEscape(user.nickName)]){
			
			var submitTxt = dic("play");
			if(user.nickName==chat.getMyNickName()){
				submitTxt = dic("remove_me");
			}
			var li = $("<li><b><img class=\"icon\" src=\"/applications/"+game+"/icon.gif\" />"+this.gameArray[game].title+"</b><i>"+user.displayName+"</i><div class=\"thumb\"></div><a href=\"#\" class=\"submit\">"+submitTxt+"</a></li>").appendTo(this.usersContainer);
			
			
			if((user.picture).length>10){
				$(".thumb", li).css("backgroundImage", "url("+this.userArray[cEscape(user.nickName)].picture+")");
			}
			li.hide().fadeIn("slow");
			
			
			if(user.nickName!=chat.getMyNickName()){
				$("a",li).click(function(){
					self.inviteResponse(user.nickName, game);
					li.hide();
				});
			}else{
				$("a",li).click(function(){
					self.openApplicationCallback(game,user.nickName); // remove box
					li.hide();
				});
			}
			this.gameArray[game].users[cEscape(user.nickName)] = li;
			
			
			
		}
	}
	this.removeUser=function(nickName, game){
		if(this.gameArray[game].users[cEscape(nickName)]){
			this.gameArray[game].users[cEscape(nickName)].remove();
			this.gameArray[game].users[cEscape(nickName)]=null;
		}
	}
	this.gameRequest=function(game){
		var room = this.roomByGameArray[game];
		var json = '{"f":"changeUserCrown", "params":{"room":"'+room+'", "nickName":"'+chat.getMyNickName()+'", "crown":"4" } }';
		chat.flashDataOutputHandler(json);
	}
	this.inviteResponse=function(nickName, game){
		chat.inviteResponse(nickName, game);
	}
	this.openApplicationCallback=function(game, nickName){
		// unvoice me to show that we are not interested in new game anymore
		var room = this.roomByGameArray[game];
		var json = '{"f":"changeUserCrown", "params":{"room":"'+room+'", "nickName":"'+chat.getMyNickName()+'", "crown":"1" } }';
		chat.flashDataOutputHandler(json);
	}


}	
