var Prototype={Version:"1.6.1",Browser:(function(){var b=navigator.userAgent;var a=Object.prototype.toString.call(window.opera)=="[object Opera]";return{IE:!!window.attachEvent&&!a,Opera:a,WebKit:b.indexOf("AppleWebKit/")>-1,Gecko:b.indexOf("Gecko")>-1&&b.indexOf("KHTML")===-1,MobileSafari:/Apple.*Mobile.*Safari/.test(b)}})(),BrowserFeatures:{XPath:!!document.evaluate,SelectorsAPI:!!document.querySelector,ElementExtensions:(function(){var a=window.Element||window.HTMLElement;return !!(a&&a.prototype)})(),SpecificElementExtensions:(function(){if(typeof window.HTMLDivElement!=="undefined"){return true}var c=document.createElement("div");var b=document.createElement("form");var a=false;if(c.__proto__&&(c.__proto__!==b.__proto__)){a=true}c=b=null;return a})()},ScriptFragment:"<script[^>]*>([\\S\\s]*?)<\/script>",JSONFilter:/^\/\*-secure-([\s\S]*)\*\/\s*$/,emptyFunction:function(){},K:function(a){return a}};if(Prototype.Browser.MobileSafari){Prototype.BrowserFeatures.SpecificElementExtensions=false}var Abstract={};var Try={these:function(){var c;for(var b=0,d=arguments.length;b<d;b++){var a=arguments[b];try{c=a();break}catch(f){}}return c}};var Class=(function(){function a(){}function b(){var g=null,f=$A(arguments);if(Object.isFunction(f[0])){g=f.shift()}function d(){this.initialize.apply(this,arguments)}Object.extend(d,Class.Methods);d.superclass=g;d.subclasses=[];if(g){a.prototype=g.prototype;d.prototype=new a;g.subclasses.push(d)}for(var e=0;e<f.length;e++){d.addMethods(f[e])}if(!d.prototype.initialize){d.prototype.initialize=Prototype.emptyFunction}d.prototype.constructor=d;return d}function c(k){var f=this.superclass&&this.superclass.prototype;var e=Object.keys(k);if(!Object.keys({toString:true}).length){if(k.toString!=Object.prototype.toString){e.push("toString")}if(k.valueOf!=Object.prototype.valueOf){e.push("valueOf")}}for(var d=0,g=e.length;d<g;d++){var j=e[d],h=k[j];if(f&&Object.isFunction(h)&&h.argumentNames().first()=="$super"){var l=h;h=(function(n){return function(){return f[n].apply(this,arguments)}})(j).wrap(l);h.valueOf=l.valueOf.bind(l);h.toString=l.toString.bind(l)}this.prototype[j]=h}return this}return{create:b,Methods:{addMethods:c}}})();(function(){var d=Object.prototype.toString;function j(r,t){for(var s in t){r[s]=t[s]}return r}function m(r){try{if(e(r)){return"undefined"}if(r===null){return"null"}return r.inspect?r.inspect():String(r)}catch(s){if(s instanceof RangeError){return"..."}throw s}}function l(r){var t=typeof r;switch(t){case"undefined":case"function":case"unknown":return;case"boolean":return r.toString()}if(r===null){return"null"}if(r.toJSON){return r.toJSON()}if(h(r)){return}var s=[];for(var v in r){var u=l(r[v]);if(!e(u)){s.push(v.toJSON()+": "+u)}}return"{"+s.join(", ")+"}"}function c(r){return $H(r).toQueryString()}function f(r){return r&&r.toHTML?r.toHTML():String.interpret(r)}function p(r){var s=[];for(var t in r){s.push(t)}return s}function n(r){var s=[];for(var t in r){s.push(r[t])}return s}function k(r){return j({},r)}function h(r){return !!(r&&r.nodeType==1)}function g(r){return d.call(r)=="[object Array]"}function q(r){return r instanceof Hash}function b(r){return typeof r==="function"}function a(r){return d.call(r)=="[object String]"}function o(r){return d.call(r)=="[object Number]"}function e(r){return typeof r==="undefined"}j(Object,{extend:j,inspect:m,toJSON:l,toQueryString:c,toHTML:f,keys:p,values:n,clone:k,isElement:h,isArray:g,isHash:q,isFunction:b,isString:a,isNumber:o,isUndefined:e})})();Object.extend(Function.prototype,(function(){var l=Array.prototype.slice;function d(p,m){var o=p.length,n=m.length;while(n--){p[o+n]=m[n]}return p}function j(n,m){n=l.call(n,0);return d(n,m)}function g(){var m=this.toString().match(/^[\s\(]*function[^(]*\(([^)]*)\)/)[1].replace(/\/\/.*?[\r\n]|\/\*(?:.|[\r\n])*?\*\//g,"").replace(/\s+/g,"").split(",");return m.length==1&&!m[0]?[]:m}function h(o){if(arguments.length<2&&Object.isUndefined(arguments[0])){return this}var m=this,n=l.call(arguments,1);return function(){var p=j(n,arguments);return m.apply(o,p)}}function f(o){var m=this,n=l.call(arguments,1);return function(q){var p=d([q||window.event],n);return m.apply(o,p)}}function k(){if(!arguments.length){return this}var m=this,n=l.call(arguments,0);return function(){var o=j(n,arguments);return m.apply(this,o)}}function e(o){var m=this,n=l.call(arguments,1);o=o*1000;return window.setTimeout(function(){return m.apply(m,n)},o)}function a(){var m=d([0.01],arguments);return this.delay.apply(this,m)}function c(n){var m=this;return function(){var o=d([m.bind(this)],arguments);return n.apply(this,o)}}function b(){if(this._methodized){return this._methodized}var m=this;return this._methodized=function(){var n=d([this],arguments);return m.apply(null,n)}}return{argumentNames:g,bind:h,bindAsEventListener:f,curry:k,delay:e,defer:a,wrap:c,methodize:b}})());Date.prototype.toJSON=function(){return'"'+this.getUTCFullYear()+"-"+(this.getUTCMonth()+1).toPaddedString(2)+"-"+this.getUTCDate().toPaddedString(2)+"T"+this.getUTCHours().toPaddedString(2)+":"+this.getUTCMinutes().toPaddedString(2)+":"+this.getUTCSeconds().toPaddedString(2)+'Z"'};RegExp.prototype.match=RegExp.prototype.test;RegExp.escape=function(a){return String(a).replace(/([.*+?^=!:${}()|[\]\/\\])/g,"\\$1")};var PeriodicalExecuter=Class.create({initialize:function(b,a){this.callback=b;this.frequency=a;this.currentlyExecuting=false;this.registerCallback()},registerCallback:function(){this.timer=setInterval(this.onTimerEvent.bind(this),this.frequency*1000)},execute:function(){this.callback(this)},stop:function(){if(!this.timer){return}clearInterval(this.timer);this.timer=null},onTimerEvent:function(){if(!this.currentlyExecuting){try{this.currentlyExecuting=true;this.execute();this.currentlyExecuting=false}catch(a){this.currentlyExecuting=false;throw a}}}});Object.extend(String,{interpret:function(a){return a==null?"":String(a)},specialChar:{"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r","\\":"\\\\"}});Object.extend(String.prototype,(function(){function prepareReplacement(replacement){if(Object.isFunction(replacement)){return replacement}var template=new Template(replacement);return function(match){return template.evaluate(match)}}function gsub(pattern,replacement){var result="",source=this,match;replacement=prepareReplacement(replacement);if(Object.isString(pattern)){pattern=RegExp.escape(pattern)}if(!(pattern.length||pattern.source)){replacement=replacement("");return replacement+source.split("").join(replacement)+replacement}while(source.length>0){if(match=source.match(pattern)){result+=source.slice(0,match.index);result+=String.interpret(replacement(match));source=source.slice(match.index+match[0].length)}else{result+=source,source=""}}return result}function sub(pattern,replacement,count){replacement=prepareReplacement(replacement);count=Object.isUndefined(count)?1:count;return this.gsub(pattern,function(match){if(--count<0){return match[0]}return replacement(match)})}function scan(pattern,iterator){this.gsub(pattern,iterator);return String(this)}function truncate(length,truncation){length=length||30;truncation=Object.isUndefined(truncation)?"...":truncation;return this.length>length?this.slice(0,length-truncation.length)+truncation:String(this)}function strip(){return this.replace(/^\s+/,"").replace(/\s+$/,"")}function stripTags(){return this.replace(/<\w+(\s+("[^"]*"|'[^']*'|[^>])+)?>|<\/\w+>/gi,"")}function stripScripts(){return this.replace(new RegExp(Prototype.ScriptFragment,"img"),"")}function extractScripts(){var matchAll=new RegExp(Prototype.ScriptFragment,"img");var matchOne=new RegExp(Prototype.ScriptFragment,"im");return(this.match(matchAll)||[]).map(function(scriptTag){return(scriptTag.match(matchOne)||["",""])[1]})}function evalScripts(){return this.extractScripts().map(function(script){return eval(script)})}function escapeHTML(){return this.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function unescapeHTML(){return this.stripTags().replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/&amp;/g,"&")}function toQueryParams(separator){var match=this.strip().match(/([^?#]*)(#.*)?$/);if(!match){return{}}return match[1].split(separator||"&").inject({},function(hash,pair){if((pair=pair.split("="))[0]){var key=decodeURIComponent(pair.shift());var value=pair.length>1?pair.join("="):pair[0];if(value!=undefined){value=decodeURIComponent(value)}if(key in hash){if(!Object.isArray(hash[key])){hash[key]=[hash[key]]}hash[key].push(value)}else{hash[key]=value}}return hash})}function toArray(){return this.split("")}function succ(){return this.slice(0,this.length-1)+String.fromCharCode(this.charCodeAt(this.length-1)+1)}function times(count){return count<1?"":new Array(count+1).join(this)}function camelize(){var parts=this.split("-"),len=parts.length;if(len==1){return parts[0]}var camelized=this.charAt(0)=="-"?parts[0].charAt(0).toUpperCase()+parts[0].substring(1):parts[0];for(var i=1;i<len;i++){camelized+=parts[i].charAt(0).toUpperCase()+parts[i].substring(1)}return camelized}function capitalize(){return this.charAt(0).toUpperCase()+this.substring(1).toLowerCase()}function underscore(){return this.replace(/::/g,"/").replace(/([A-Z]+)([A-Z][a-z])/g,"$1_$2").replace(/([a-z\d])([A-Z])/g,"$1_$2").replace(/-/g,"_").toLowerCase()}function dasherize(){return this.replace(/_/g,"-")}function inspect(useDoubleQuotes){var escapedString=this.replace(/[\x00-\x1f\\]/g,function(character){if(character in String.specialChar){return String.specialChar[character]}return"\\u00"+character.charCodeAt().toPaddedString(2,16)});if(useDoubleQuotes){return'"'+escapedString.replace(/"/g,'\\"')+'"'}return"'"+escapedString.replace(/'/g,"\\'")+"'"}function toJSON(){return this.inspect(true)}function unfilterJSON(filter){return this.replace(filter||Prototype.JSONFilter,"$1")}function isJSON(){var str=this;if(str.blank()){return false}str=this.replace(/\\./g,"@").replace(/"[^"\\\n\r]*"/g,"");return(/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(str)}function evalJSON(sanitize){var json=this.unfilterJSON();try{if(!sanitize||json.isJSON()){return eval("("+json+")")}}catch(e){}throw new SyntaxError("Badly formed JSON string: "+this.inspect())}function include(pattern){return this.indexOf(pattern)>-1}function startsWith(pattern){return this.indexOf(pattern)===0}function endsWith(pattern){var d=this.length-pattern.length;return d>=0&&this.lastIndexOf(pattern)===d}function empty(){return this==""}function blank(){return/^\s*$/.test(this)}function interpolate(object,pattern){return new Template(this,pattern).evaluate(object)}return{gsub:gsub,sub:sub,scan:scan,truncate:truncate,strip:String.prototype.trim?String.prototype.trim:strip,stripTags:stripTags,stripScripts:stripScripts,extractScripts:extractScripts,evalScripts:evalScripts,escapeHTML:escapeHTML,unescapeHTML:unescapeHTML,toQueryParams:toQueryParams,parseQuery:toQueryParams,toArray:toArray,succ:succ,times:times,camelize:camelize,capitalize:capitalize,underscore:underscore,dasherize:dasherize,inspect:inspect,toJSON:toJSON,unfilterJSON:unfilterJSON,isJSON:isJSON,evalJSON:evalJSON,include:include,startsWith:startsWith,endsWith:endsWith,empty:empty,blank:blank,interpolate:interpolate}})());var Template=Class.create({initialize:function(a,b){this.template=a.toString();this.pattern=b||Template.Pattern},evaluate:function(a){if(a&&Object.isFunction(a.toTemplateReplacements)){a=a.toTemplateReplacements()}return this.template.gsub(this.pattern,function(d){if(a==null){return(d[1]+"")}var f=d[1]||"";if(f=="\\"){return d[2]}var b=a,g=d[3];var e=/^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/;d=e.exec(g);if(d==null){return f}while(d!=null){var c=d[1].startsWith("[")?d[2].replace(/\\\\]/g,"]"):d[1];b=b[c];if(null==b||""==d[3]){break}g=g.substring("["==d[3]?d[1].length:d[0].length);d=e.exec(g)}return f+String.interpret(b)})}});Template.Pattern=/(^|.|\r|\n)(#\{(.*?)\})/;var $break={};var Enumerable=(function(){function c(z,y){var x=0;try{this._each(function(B){z.call(y,B,x++)})}catch(A){if(A!=$break){throw A}}return this}function s(A,z,y){var x=-A,B=[],C=this.toArray();if(A<1){return C}while((x+=A)<C.length){B.push(C.slice(x,x+A))}return B.collect(z,y)}function b(z,y){z=z||Prototype.K;var x=true;this.each(function(B,A){x=x&&!!z.call(y,B,A);if(!x){throw $break}});return x}function j(z,y){z=z||Prototype.K;var x=false;this.each(function(B,A){if(x=!!z.call(y,B,A)){throw $break}});return x}function k(z,y){z=z||Prototype.K;var x=[];this.each(function(B,A){x.push(z.call(y,B,A))});return x}function u(z,y){var x;this.each(function(B,A){if(z.call(y,B,A)){x=B;throw $break}});return x}function h(z,y){var x=[];this.each(function(B,A){if(z.call(y,B,A)){x.push(B)}});return x}function g(A,z,y){z=z||Prototype.K;var x=[];if(Object.isString(A)){A=new RegExp(RegExp.escape(A))}this.each(function(C,B){if(A.match(C)){x.push(z.call(y,C,B))}});return x}function a(x){if(Object.isFunction(this.indexOf)){if(this.indexOf(x)!=-1){return true}}var y=false;this.each(function(z){if(z==x){y=true;throw $break}});return y}function r(y,x){x=Object.isUndefined(x)?null:x;return this.eachSlice(y,function(z){while(z.length<y){z.push(x)}return z})}function m(x,z,y){this.each(function(B,A){x=z.call(y,x,B,A)});return x}function w(y){var x=$A(arguments).slice(1);return this.map(function(z){return z[y].apply(z,x)})}function q(z,y){z=z||Prototype.K;var x;this.each(function(B,A){B=z.call(y,B,A);if(x==null||B>=x){x=B}});return x}function o(z,y){z=z||Prototype.K;var x;this.each(function(B,A){B=z.call(y,B,A);if(x==null||B<x){x=B}});return x}function e(A,y){A=A||Prototype.K;var z=[],x=[];this.each(function(C,B){(A.call(y,C,B)?z:x).push(C)});return[z,x]}function f(y){var x=[];this.each(function(z){x.push(z[y])});return x}function d(z,y){var x=[];this.each(function(B,A){if(!z.call(y,B,A)){x.push(B)}});return x}function n(y,x){return this.map(function(A,z){return{value:A,criteria:y.call(x,A,z)}}).sort(function(C,B){var A=C.criteria,z=B.criteria;return A<z?-1:A>z?1:0}).pluck("value")}function p(){return this.map()}function t(){var y=Prototype.K,x=$A(arguments);if(Object.isFunction(x.last())){y=x.pop()}var z=[this].concat(x).map($A);return this.map(function(B,A){return y(z.pluck(A))})}function l(){return this.toArray().length}function v(){return"#<Enumerable:"+this.toArray().inspect()+">"}return{each:c,eachSlice:s,all:b,every:b,any:j,some:j,collect:k,map:k,detect:u,findAll:h,select:h,filter:h,grep:g,include:a,member:a,inGroupsOf:r,inject:m,invoke:w,max:q,min:o,partition:e,pluck:f,reject:d,sortBy:n,toArray:p,entries:p,zip:t,size:l,inspect:v,find:u}})();function $A(c){if(!c){return[]}if("toArray" in Object(c)){return c.toArray()}var b=c.length||0,a=new Array(b);while(b--){a[b]=c[b]}return a}function $w(a){if(!Object.isString(a)){return[]}a=a.strip();return a?a.split(/\s+/):[]}Array.from=$A;(function(){var t=Array.prototype,n=t.slice,p=t.forEach;function b(x){for(var w=0,y=this.length;w<y;w++){x(this[w])}}if(!p){p=b}function m(){this.length=0;return this}function d(){return this[0]}function g(){return this[this.length-1]}function j(){return this.select(function(w){return w!=null})}function v(){return this.inject([],function(x,w){if(Object.isArray(w)){return x.concat(w.flatten())}x.push(w);return x})}function h(){var w=n.call(arguments,0);return this.select(function(x){return !w.include(x)})}function f(w){return(w!==false?this:this.toArray())._reverse()}function l(w){return this.inject([],function(z,y,x){if(0==x||(w?z.last()!=y:!z.include(y))){z.push(y)}return z})}function q(w){return this.uniq().findAll(function(x){return w.detect(function(y){return x===y})})}function r(){return n.call(this,0)}function k(){return this.length}function u(){return"["+this.map(Object.inspect).join(", ")+"]"}function s(){var w=[];this.each(function(x){var y=Object.toJSON(x);if(!Object.isUndefined(y)){w.push(y)}});return"["+w.join(", ")+"]"}function a(y,w){w||(w=0);var x=this.length;if(w<0){w=x+w}for(;w<x;w++){if(this[w]===y){return w}}return -1}function o(x,w){w=isNaN(w)?this.length:(w<0?this.length+w:w)+1;var y=this.slice(0,w).reverse().indexOf(x);return(y<0)?y:w-y-1}function c(){var B=n.call(this,0),z;for(var x=0,y=arguments.length;x<y;x++){z=arguments[x];if(Object.isArray(z)&&!("callee" in z)){for(var w=0,A=z.length;w<A;w++){B.push(z[w])}}else{B.push(z)}}return B}Object.extend(t,Enumerable);if(!t._reverse){t._reverse=t.reverse}Object.extend(t,{_each:p,clear:m,first:d,last:g,compact:j,flatten:v,without:h,reverse:f,uniq:l,intersect:q,clone:r,toArray:r,size:k,inspect:u,toJSON:s});var e=(function(){return[].concat(arguments)[0][0]!==1})(1,2);if(e){t.concat=c}if(!t.indexOf){t.indexOf=a}if(!t.lastIndexOf){t.lastIndexOf=o}})();function $H(a){return new Hash(a)}var Hash=Class.create(Enumerable,(function(){function e(r){this._object=Object.isHash(r)?r.toObject():Object.clone(r)}function f(s){for(var r in this._object){var t=this._object[r],u=[r,t];u.key=r;u.value=t;s(u)}}function l(r,s){return this._object[r]=s}function c(r){if(this._object[r]!==Object.prototype[r]){return this._object[r]}}function o(r){var s=this._object[r];delete this._object[r];return s}function q(){return Object.clone(this._object)}function p(){return this.pluck("key")}function n(){return this.pluck("value")}function g(s){var r=this.detect(function(t){return t.value===s});return r&&r.key}function j(r){return this.clone().update(r)}function d(r){return new Hash(r).inject(this,function(s,t){s.set(t.key,t.value);return s})}function b(r,s){if(Object.isUndefined(s)){return r}return r+"="+encodeURIComponent(String.interpret(s))}function a(){return this.inject([],function(t,u){var s=encodeURIComponent(u.key),r=u.value;if(r&&typeof r=="object"){if(Object.isArray(r)){return t.concat(r.map(b.curry(s)))}}else{t.push(b(s,r))}return t}).join("&")}function m(){return"#<Hash:{"+this.map(function(r){return r.map(Object.inspect).join(": ")}).join(", ")+"}>"}function k(){return Object.toJSON(this.toObject())}function h(){return new Hash(this)}return{initialize:e,_each:f,set:l,get:c,unset:o,toObject:q,toTemplateReplacements:q,keys:p,values:n,index:g,merge:j,update:d,toQueryString:a,inspect:m,toJSON:k,clone:h}})());Hash.from=$H;Object.extend(Number.prototype,(function(){function d(){return this.toPaddedString(2,16)}function e(){return this+1}function a(l,k){$R(0,this,true).each(l,k);return this}function b(m,l){var k=this.toString(l||10);return"0".times(m-k.length)+k}function f(){return isFinite(this)?this.toString():"null"}function j(){return Math.abs(this)}function h(){return Math.round(this)}function g(){return Math.ceil(this)}function c(){return Math.floor(this)}return{toColorPart:d,succ:e,times:a,toPaddedString:b,toJSON:f,abs:j,round:h,ceil:g,floor:c}})());function $R(c,a,b){return new ObjectRange(c,a,b)}var ObjectRange=Class.create(Enumerable,(function(){function b(f,d,e){this.start=f;this.end=d;this.exclusive=e}function c(d){var e=this.start;while(this.include(e)){d(e);e=e.succ()}}function a(d){if(d<this.start){return false}if(this.exclusive){return d<this.end}return d<=this.end}return{initialize:b,_each:c,include:a}})());var Ajax={getTransport:function(){return Try.these(function(){return new XMLHttpRequest()},function(){return new ActiveXObject("Msxml2.XMLHTTP")},function(){return new ActiveXObject("Microsoft.XMLHTTP")})||false},activeRequestCount:0};Ajax.Responders={responders:[],_each:function(a){this.responders._each(a)},register:function(a){if(!this.include(a)){this.responders.push(a)}},unregister:function(a){this.responders=this.responders.without(a)},dispatch:function(d,b,c,a){this.each(function(f){if(Object.isFunction(f[d])){try{f[d].apply(f,[b,c,a])}catch(g){}}})}};Object.extend(Ajax.Responders,Enumerable);Ajax.Responders.register({onCreate:function(){Ajax.activeRequestCount++},onComplete:function(){Ajax.activeRequestCount--}});Ajax.Base=Class.create({initialize:function(a){this.options={method:"post",asynchronous:true,contentType:"application/x-www-form-urlencoded",encoding:"UTF-8",parameters:"",evalJSON:true,evalJS:true};Object.extend(this.options,a||{});this.options.method=this.options.method.toLowerCase();if(Object.isString(this.options.parameters)){this.options.parameters=this.options.parameters.toQueryParams()}else{if(Object.isHash(this.options.parameters)){this.options.parameters=this.options.parameters.toObject()}}}});Ajax.Request=Class.create(Ajax.Base,{_complete:false,initialize:function($super,b,a){$super(a);this.transport=Ajax.getTransport();this.request(b)},request:function(b){this.url=b;this.method=this.options.method;var d=Object.clone(this.options.parameters);if(!["get","post"].include(this.method)){d._method=this.method;this.method="post"}this.parameters=d;if(d=Object.toQueryString(d)){if(this.method=="get"){this.url+=(this.url.include("?")?"&":"?")+d}else{if(/Konqueror|Safari|KHTML/.test(navigator.userAgent)){d+="&_="}}}try{var a=new Ajax.Response(this);if(this.options.onCreate){this.options.onCreate(a)}Ajax.Responders.dispatch("onCreate",this,a);this.transport.open(this.method.toUpperCase(),this.url,this.options.asynchronous);if(this.options.asynchronous){this.respondToReadyState.bind(this).defer(1)}this.transport.onreadystatechange=this.onStateChange.bind(this);this.setRequestHeaders();this.body=this.method=="post"?(this.options.postBody||d):null;this.transport.send(this.body);if(!this.options.asynchronous&&this.transport.overrideMimeType){this.onStateChange()}}catch(c){this.dispatchException(c)}},onStateChange:function(){var a=this.transport.readyState;if(a>1&&!((a==4)&&this._complete)){this.respondToReadyState(this.transport.readyState)}},setRequestHeaders:function(){var e={"X-Requested-With":"XMLHttpRequest","X-Prototype-Version":Prototype.Version,Accept:"text/javascript, text/html, application/xml, text/xml, */*"};if(this.method=="post"){e["Content-type"]=this.options.contentType+(this.options.encoding?"; charset="+this.options.encoding:"");if(this.transport.overrideMimeType&&(navigator.userAgent.match(/Gecko\/(\d{4})/)||[0,2005])[1]<2005){e.Connection="close"}}if(typeof this.options.requestHeaders=="object"){var c=this.options.requestHeaders;if(Object.isFunction(c.push)){for(var b=0,d=c.length;b<d;b+=2){e[c[b]]=c[b+1]}}else{$H(c).each(function(f){e[f.key]=f.value})}}for(var a in e){this.transport.setRequestHeader(a,e[a])}},success:function(){var a=this.getStatus();return !a||(a>=200&&a<300)},getStatus:function(){try{return this.transport.status||0}catch(a){return 0}},respondToReadyState:function(a){var c=Ajax.Request.Events[a],b=new Ajax.Response(this);if(c=="Complete"){try{this._complete=true;(this.options["on"+b.status]||this.options["on"+(this.success()?"Success":"Failure")]||Prototype.emptyFunction)(b,b.headerJSON)}catch(d){this.dispatchException(d)}var f=b.getHeader("Content-type");if(this.options.evalJS=="force"||(this.options.evalJS&&this.isSameOrigin()&&f&&f.match(/^\s*(text|application)\/(x-)?(java|ecma)script(;.*)?\s*$/i))){this.evalResponse()}}try{(this.options["on"+c]||Prototype.emptyFunction)(b,b.headerJSON);Ajax.Responders.dispatch("on"+c,this,b,b.headerJSON)}catch(d){this.dispatchException(d)}if(c=="Complete"){this.transport.onreadystatechange=Prototype.emptyFunction}},isSameOrigin:function(){var a=this.url.match(/^\s*https?:\/\/[^\/]*/);return !a||(a[0]=="#{protocol}//#{domain}#{port}".interpolate({protocol:location.protocol,domain:document.domain,port:location.port?":"+location.port:""}))},getHeader:function(a){try{return this.transport.getResponseHeader(a)||null}catch(b){return null}},evalResponse:function(){try{return eval((this.transport.responseText||"").unfilterJSON())}catch(e){this.dispatchException(e)}},dispatchException:function(a){(this.options.onException||Prototype.emptyFunction)(this,a);Ajax.Responders.dispatch("onException",this,a)}});Ajax.Request.Events=["Uninitialized","Loading","Loaded","Interactive","Complete"];Ajax.Response=Class.create({initialize:function(c){this.request=c;var d=this.transport=c.transport,a=this.readyState=d.readyState;if((a>2&&!Prototype.Browser.IE)||a==4){this.status=this.getStatus();this.statusText=this.getStatusText();this.responseText=String.interpret(d.responseText);this.headerJSON=this._getHeaderJSON()}if(a==4){var b=d.responseXML;this.responseXML=Object.isUndefined(b)?null:b;this.responseJSON=this._getResponseJSON()}},status:0,statusText:"",getStatus:Ajax.Request.prototype.getStatus,getStatusText:function(){try{return this.transport.statusText||""}catch(a){return""}},getHeader:Ajax.Request.prototype.getHeader,getAllHeaders:function(){try{return this.getAllResponseHeaders()}catch(a){return null}},getResponseHeader:function(a){return this.transport.getResponseHeader(a)},getAllResponseHeaders:function(){return this.transport.getAllResponseHeaders()},_getHeaderJSON:function(){var a=this.getHeader("X-JSON");if(!a){return null}a=decodeURIComponent(escape(a));try{return a.evalJSON(this.request.options.sanitizeJSON||!this.request.isSameOrigin())}catch(b){this.request.dispatchException(b)}},_getResponseJSON:function(){var a=this.request.options;if(!a.evalJSON||(a.evalJSON!="force"&&!(this.getHeader("Content-type")||"").include("application/json"))||this.responseText.blank()){return null}try{return this.responseText.evalJSON(a.sanitizeJSON||!this.request.isSameOrigin())}catch(b){this.request.dispatchException(b)}}});Ajax.Updater=Class.create(Ajax.Request,{initialize:function($super,a,c,b){this.container={success:(a.success||a),failure:(a.failure||(a.success?null:a))};b=Object.clone(b);var d=b.onComplete;b.onComplete=(function(e,f){this.updateContent(e.responseText);if(Object.isFunction(d)){d(e,f)}}).bind(this);$super(c,b)},updateContent:function(d){var c=this.container[this.success()?"success":"failure"],a=this.options;if(!a.evalScripts){d=d.stripScripts()}if(c=$(c)){if(a.insertion){if(Object.isString(a.insertion)){var b={};b[a.insertion]=d;c.insert(b)}else{a.insertion(c,d)}}else{c.update(d)}}}});Ajax.PeriodicalUpdater=Class.create(Ajax.Base,{initialize:function($super,a,c,b){$super(b);this.onComplete=this.options.onComplete;this.frequency=(this.options.frequency||2);this.decay=(this.options.decay||1);this.updater={};this.container=a;this.url=c;this.start()},start:function(){this.options.onComplete=this.updateComplete.bind(this);this.onTimerEvent()},stop:function(){this.updater.options.onComplete=undefined;clearTimeout(this.timer);(this.onComplete||Prototype.emptyFunction).apply(this,arguments)},updateComplete:function(a){if(this.options.decay){this.decay=(a.responseText==this.lastText?this.decay*this.options.decay:1);this.lastText=a.responseText}this.timer=this.onTimerEvent.bind(this).delay(this.decay*this.frequency)},onTimerEvent:function(){this.updater=new Ajax.Updater(this.container,this.url,this.options)}});function $(b){if(arguments.length>1){for(var a=0,d=[],c=arguments.length;a<c;a++){d.push($(arguments[a]))}return d}if(Object.isString(b)){b=document.getElementById(b)}return Element.extend(b)}if(Prototype.BrowserFeatures.XPath){document._getElementsByXPath=function(f,a){var c=[];var e=document.evaluate(f,$(a)||document,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null);for(var b=0,d=e.snapshotLength;b<d;b++){c.push(Element.extend(e.snapshotItem(b)))}return c}}if(!window.Node){var Node={}}if(!Node.ELEMENT_NODE){Object.extend(Node,{ELEMENT_NODE:1,ATTRIBUTE_NODE:2,TEXT_NODE:3,CDATA_SECTION_NODE:4,ENTITY_REFERENCE_NODE:5,ENTITY_NODE:6,PROCESSING_INSTRUCTION_NODE:7,COMMENT_NODE:8,DOCUMENT_NODE:9,DOCUMENT_TYPE_NODE:10,DOCUMENT_FRAGMENT_NODE:11,NOTATION_NODE:12})}(function(c){var b=(function(){var f=document.createElement("form");var e=document.createElement("input");var d=document.documentElement;e.setAttribute("name","test");f.appendChild(e);d.appendChild(f);var g=f.elements?(typeof f.elements.test=="undefined"):null;d.removeChild(f);f=e=null;return g})();var a=c.Element;c.Element=function(f,e){e=e||{};f=f.toLowerCase();var d=Element.cache;if(b&&e.name){f="<"+f+' name="'+e.name+'">';delete e.name;return Element.writeAttribute(document.createElement(f),e)}if(!d[f]){d[f]=Element.extend(document.createElement(f))}return Element.writeAttribute(d[f].cloneNode(false),e)};Object.extend(c.Element,a||{});if(a){c.Element.prototype=a.prototype}})(this);Element.cache={};Element.idCounter=1;Element.Methods={visible:function(a){return $(a).style.display!="none"},toggle:function(a){a=$(a);Element[Element.visible(a)?"hide":"show"](a);return a},hide:function(a){a=$(a);a.style.display="none";return a},show:function(a){a=$(a);a.style.display="";return a},remove:function(a){a=$(a);a.parentNode.removeChild(a);return a},update:(function(){var b=(function(){var e=document.createElement("select"),f=true;e.innerHTML='<option value="test">test</option>';if(e.options&&e.options[0]){f=e.options[0].nodeName.toUpperCase()!=="OPTION"}e=null;return f})();var a=(function(){try{var f=document.createElement("table");if(f&&f.tBodies){f.innerHTML="<tbody><tr><td>test</td></tr></tbody>";var h=typeof f.tBodies[0]=="undefined";f=null;return h}}catch(g){return true}})();var d=(function(){var f=document.createElement("script"),h=false;try{f.appendChild(document.createTextNode(""));h=!f.firstChild||f.firstChild&&f.firstChild.nodeType!==3}catch(g){h=true}f=null;return h})();function c(f,g){f=$(f);if(g&&g.toElement){g=g.toElement()}if(Object.isElement(g)){return f.update().insert(g)}g=Object.toHTML(g);var e=f.tagName.toUpperCase();if(e==="SCRIPT"&&d){f.text=g;return f}if(b||a){if(e in Element._insertionTranslations.tags){while(f.firstChild){f.removeChild(f.firstChild)}Element._getContentFromAnonymousElement(e,g.stripScripts()).each(function(h){f.appendChild(h)})}else{f.innerHTML=g.stripScripts()}}else{f.innerHTML=g.stripScripts()}g.evalScripts.bind(g).defer();return f}return c})(),replace:function(b,c){b=$(b);if(c&&c.toElement){c=c.toElement()}else{if(!Object.isElement(c)){c=Object.toHTML(c);var a=b.ownerDocument.createRange();a.selectNode(b);c.evalScripts.bind(c).defer();c=a.createContextualFragment(c.stripScripts())}}b.parentNode.replaceChild(c,b);return b},insert:function(c,e){c=$(c);if(Object.isString(e)||Object.isNumber(e)||Object.isElement(e)||(e&&(e.toElement||e.toHTML))){e={bottom:e}}var d,f,b,g;for(var a in e){d=e[a];a=a.toLowerCase();f=Element._insertionTranslations[a];if(d&&d.toElement){d=d.toElement()}if(Object.isElement(d)){f(c,d);continue}d=Object.toHTML(d);b=((a=="before"||a=="after")?c.parentNode:c).tagName.toUpperCase();g=Element._getContentFromAnonymousElement(b,d.stripScripts());if(a=="top"||a=="after"){g.reverse()}g.each(f.curry(c));d.evalScripts.bind(d).defer()}return c},wrap:function(b,c,a){b=$(b);if(Object.isElement(c)){$(c).writeAttribute(a||{})}else{if(Object.isString(c)){c=new Element(c,a)}else{c=new Element("div",c)}}if(b.parentNode){b.parentNode.replaceChild(c,b)}c.appendChild(b);return c},inspect:function(b){b=$(b);var a="<"+b.tagName.toLowerCase();$H({id:"id",className:"class"}).each(function(f){var e=f.first(),c=f.last();var d=(b[e]||"").toString();if(d){a+=" "+c+"="+d.inspect(true)}});return a+">"},recursivelyCollect:function(a,c){a=$(a);var b=[];while(a=a[c]){if(a.nodeType==1){b.push(Element.extend(a))}}return b},ancestors:function(a){return Element.recursivelyCollect(a,"parentNode")},descendants:function(a){return Element.select(a,"*")},firstDescendant:function(a){a=$(a).firstChild;while(a&&a.nodeType!=1){a=a.nextSibling}return $(a)},immediateDescendants:function(a){if(!(a=$(a).firstChild)){return[]}while(a&&a.nodeType!=1){a=a.nextSibling}if(a){return[a].concat($(a).nextSiblings())}return[]},previousSiblings:function(a){return Element.recursivelyCollect(a,"previousSibling")},nextSiblings:function(a){return Element.recursivelyCollect(a,"nextSibling")},siblings:function(a){a=$(a);return Element.previousSiblings(a).reverse().concat(Element.nextSiblings(a))},match:function(b,a){if(Object.isString(a)){a=new Selector(a)}return a.match($(b))},up:function(b,d,a){b=$(b);if(arguments.length==1){return $(b.parentNode)}var c=Element.ancestors(b);return Object.isNumber(d)?c[d]:Selector.findElement(c,d,a)},down:function(b,c,a){b=$(b);if(arguments.length==1){return Element.firstDescendant(b)}return Object.isNumber(c)?Element.descendants(b)[c]:Element.select(b,c)[a||0]},previous:function(b,d,a){b=$(b);if(arguments.length==1){return $(Selector.handlers.previousElementSibling(b))}var c=Element.previousSiblings(b);return Object.isNumber(d)?c[d]:Selector.findElement(c,d,a)},next:function(c,d,b){c=$(c);if(arguments.length==1){return $(Selector.handlers.nextElementSibling(c))}var a=Element.nextSiblings(c);return Object.isNumber(d)?a[d]:Selector.findElement(a,d,b)},select:function(b){var a=Array.prototype.slice.call(arguments,1);return Selector.findChildElements(b,a)},adjacent:function(b){var a=Array.prototype.slice.call(arguments,1);return Selector.findChildElements(b.parentNode,a).without(b)},identify:function(a){a=$(a);var b=Element.readAttribute(a,"id");if(b){return b}do{b="anonymous_element_"+Element.idCounter++}while($(b));Element.writeAttribute(a,"id",b);return b},readAttribute:function(c,a){c=$(c);if(Prototype.Browser.IE){var b=Element._attributeTranslations.read;if(b.values[a]){return b.values[a](c,a)}if(b.names[a]){a=b.names[a]}if(a.include(":")){return(!c.attributes||!c.attributes[a])?null:c.attributes[a].value}}return c.getAttribute(a)},writeAttribute:function(e,c,f){e=$(e);var b={},d=Element._attributeTranslations.write;if(typeof c=="object"){b=c}else{b[c]=Object.isUndefined(f)?true:f}for(var a in b){c=d.names[a]||a;f=b[a];if(d.values[a]){c=d.values[a](e,f)}if(f===false||f===null){e.removeAttribute(c)}else{if(f===true){e.setAttribute(c,c)}else{e.setAttribute(c,f)}}}return e},getHeight:function(a){return Element.getDimensions(a).height},getWidth:function(a){return Element.getDimensions(a).width},classNames:function(a){return new Element.ClassNames(a)},hasClassName:function(a,b){if(!(a=$(a))){return}var c=a.className;return(c.length>0&&(c==b||new RegExp("(^|\\s)"+b+"(\\s|$)").test(c)))},addClassName:function(a,b){if(!(a=$(a))){return}if(!Element.hasClassName(a,b)){a.className+=(a.className?" ":"")+b}return a},removeClassName:function(a,b){if(!(a=$(a))){return}a.className=a.className.replace(new RegExp("(^|\\s+)"+b+"(\\s+|$)")," ").strip();return a},toggleClassName:function(a,b){if(!(a=$(a))){return}return Element[Element.hasClassName(a,b)?"removeClassName":"addClassName"](a,b)},cleanWhitespace:function(b){if(typeof(b)=='string'){b=$(b);}var c=b.firstChild;while(c){var a=c.nextSibling;if(c.nodeType==3&&!/\S/.test(c.nodeValue)){b.removeChild(c)}c=a}return b},empty:function(a){return $(a).innerHTML.blank()},descendantOf:function(b,a){b=$(b),a=$(a);if(b.compareDocumentPosition){return(b.compareDocumentPosition(a)&8)===8}if(a.contains){return a.contains(b)&&a!==b}while(b=b.parentNode){if(b==a){return true}}return false},scrollTo:function(a){a=$(a);var b=Element.cumulativeOffset(a);window.scrollTo(b[0],b[1]);return a},getStyle:function(b,c){b=$(b);c=c=="float"?"cssFloat":c.camelize();var d=b.style[c];if(!d||d=="auto"){var a=document.defaultView.getComputedStyle(b,null);d=a?a[c]:null}if(c=="opacity"){return d?parseFloat(d):1}return d=="auto"?null:d},getOpacity:function(a){return $(a).getStyle("opacity")},setStyle:function(b,c){b=$(b);var e=b.style,a;if(Object.isString(c)){b.style.cssText+=";"+c;return c.include("opacity")?b.setOpacity(c.match(/opacity:\s*(\d?\.?\d*)/)[1]):b}for(var d in c){if(d=="opacity"){b.setOpacity(c[d])}else{e[(d=="float"||d=="cssFloat")?(Object.isUndefined(e.styleFloat)?"cssFloat":"styleFloat"):d]=c[d]}}return b},setOpacity:function(a,b){a=$(a);a.style.opacity=(b==1||b==="")?"":(b<0.00001)?0:b;return a},getDimensions:function(c){c=$(c);var g=Element.getStyle(c,"display");if(g!="none"&&g!=null){return{width:c.offsetWidth,height:c.offsetHeight}}var b=c.style;var f=b.visibility;var d=b.position;var a=b.display;b.visibility="hidden";if(d!="fixed"){b.position="absolute"}b.display="block";var h=c.clientWidth;var e=c.clientHeight;b.display=a;b.position=d;b.visibility=f;return{width:h,height:e}},makePositioned:function(a){a=$(a);var b=Element.getStyle(a,"position");if(b=="static"||!b){a._madePositioned=true;a.style.position="relative";if(Prototype.Browser.Opera){a.style.top=0;a.style.left=0}}return a},undoPositioned:function(a){a=$(a);if(a._madePositioned){a._madePositioned=undefined;a.style.position=a.style.top=a.style.left=a.style.bottom=a.style.right=""}return a},makeClipping:function(a){a=$(a);if(a._overflow){return a}a._overflow=Element.getStyle(a,"overflow")||"auto";if(a._overflow!=="hidden"){a.style.overflow="hidden"}return a},undoClipping:function(a){a=$(a);if(!a._overflow){return a}a.style.overflow=a._overflow=="auto"?"":a._overflow;a._overflow=null;return a},cumulativeOffset:function(b){var a=0,c=0;do{a+=b.offsetTop||0;c+=b.offsetLeft||0;b=b.offsetParent}while(b);return Element._returnOffset(c,a)},positionedOffset:function(b){var a=0,d=0;do{a+=b.offsetTop||0;d+=b.offsetLeft||0;b=b.offsetParent;if(b){if(b.tagName.toUpperCase()=="BODY"){break}var c=Element.getStyle(b,"position");if(c!=="static"){break}}}while(b);return Element._returnOffset(d,a)},absolutize:function(b){b=$(b);if(Element.getStyle(b,"position")=="absolute"){return b}var d=Element.positionedOffset(b);var f=d[1];var e=d[0];var c=b.clientWidth;var a=b.clientHeight;b._originalLeft=e-parseFloat(b.style.left||0);b._originalTop=f-parseFloat(b.style.top||0);b._originalWidth=b.style.width;b._originalHeight=b.style.height;b.style.position="absolute";b.style.top=f+"px";b.style.left=e+"px";b.style.width=c+"px";b.style.height=a+"px";return b},relativize:function(a){a=$(a);if(Element.getStyle(a,"position")=="relative"){return a}a.style.position="relative";var c=parseFloat(a.style.top||0)-(a._originalTop||0);var b=parseFloat(a.style.left||0)-(a._originalLeft||0);a.style.top=c+"px";a.style.left=b+"px";a.style.height=a._originalHeight;a.style.width=a._originalWidth;return a},cumulativeScrollOffset:function(b){var a=0,c=0;do{a+=b.scrollTop||0;c+=b.scrollLeft||0;b=b.parentNode}while(b);return Element._returnOffset(c,a)},getOffsetParent:function(a){if(a.offsetParent){return $(a.offsetParent)}if(a==document.body){return $(a)}while((a=a.parentNode)&&a!=document.body){if(Element.getStyle(a,"position")!="static"){return $(a)}}return $(document.body)},viewportOffset:function(d){var a=0,c=0;var b=d;do{a+=b.offsetTop||0;c+=b.offsetLeft||0;if(b.offsetParent==document.body&&Element.getStyle(b,"position")=="absolute"){break}}while(b=b.offsetParent);b=d;do{if(!Prototype.Browser.Opera||(b.tagName&&(b.tagName.toUpperCase()=="BODY"))){a-=b.scrollTop||0;c-=b.scrollLeft||0}}while(b=b.parentNode);return Element._returnOffset(c,a)},clonePosition:function(b,d){var a=Object.extend({setLeft:true,setTop:true,setWidth:true,setHeight:true,offsetTop:0,offsetLeft:0},arguments[2]||{});d=$(d);var e=Element.viewportOffset(d);b=$(b);var f=[0,0];var c=null;if(Element.getStyle(b,"position")=="absolute"){c=Element.getOffsetParent(b);f=Element.viewportOffset(c)}if(c==document.body){f[0]-=document.body.offsetLeft;f[1]-=document.body.offsetTop}if(a.setLeft){b.style.left=(e[0]-f[0]+a.offsetLeft)+"px"}if(a.setTop){b.style.top=(e[1]-f[1]+a.offsetTop)+"px"}if(a.setWidth){b.style.width=d.offsetWidth+"px"}if(a.setHeight){b.style.height=d.offsetHeight+"px"}return b}};Object.extend(Element.Methods,{getElementsBySelector:Element.Methods.select,childElements:Element.Methods.immediateDescendants});Element._attributeTranslations={write:{names:{className:"class",htmlFor:"for"},values:{}}};if(Prototype.Browser.Opera){Element.Methods.getStyle=Element.Methods.getStyle.wrap(function(d,b,c){switch(c){case"left":case"top":case"right":case"bottom":if(d(b,"position")==="static"){return null}case"height":case"width":if(!Element.visible(b)){return null}var e=parseInt(d(b,c),10);if(e!==b["offset"+c.capitalize()]){return e+"px"}var a;if(c==="height"){a=["border-top-width","padding-top","padding-bottom","border-bottom-width"]}else{a=["border-left-width","padding-left","padding-right","border-right-width"]}return a.inject(e,function(f,g){var h=d(b,g);return h===null?f:f-parseInt(h,10)})+"px";default:return d(b,c)}});Element.Methods.readAttribute=Element.Methods.readAttribute.wrap(function(c,a,b){if(b==="title"){return a.title}return c(a,b)})}else{if(Prototype.Browser.IE){Element.Methods.getOffsetParent=Element.Methods.getOffsetParent.wrap(function(c,b){b=$(b);try{b.offsetParent}catch(f){return $(document.body)}var a=b.getStyle("position");if(a!=="static"){return c(b)}b.setStyle({position:"relative"});var d=c(b);b.setStyle({position:a});return d});$w("positionedOffset viewportOffset").each(function(a){Element.Methods[a]=Element.Methods[a].wrap(function(f,c){c=$(c);try{c.offsetParent}catch(h){return Element._returnOffset(0,0)}var b=c.getStyle("position");if(b!=="static"){return f(c)}var d=c.getOffsetParent();if(d&&d.getStyle("position")==="fixed"){d.setStyle({zoom:1})}c.setStyle({position:"relative"});var g=f(c);c.setStyle({position:b});return g})});Element.Methods.cumulativeOffset=Element.Methods.cumulativeOffset.wrap(function(b,a){try{a.offsetParent}catch(c){return Element._returnOffset(0,0)}return b(a)});Element.Methods.getStyle=function(a,b){a=$(a);b=(b=="float"||b=="cssFloat")?"styleFloat":b.camelize();var c=a.style[b];if(!c&&a.currentStyle){c=a.currentStyle[b]}if(b=="opacity"){if(c=(a.getStyle("filter")||"").match(/alpha\(opacity=(.*)\)/)){if(c[1]){return parseFloat(c[1])/100}}return 1}if(c=="auto"){if((b=="width"||b=="height")&&(a.getStyle("display")!="none")){return a["offset"+b.capitalize()]+"px"}return null}return c};Element.Methods.setOpacity=function(b,e){function f(g){return g.replace(/alpha\([^\)]*\)/gi,"")}b=$(b);var a=b.currentStyle;if((a&&!a.hasLayout)||(!a&&b.style.zoom=="normal")){b.style.zoom=1}var d=b.getStyle("filter"),c=b.style;if(e==1||e===""){(d=f(d))?c.filter=d:c.removeAttribute("filter");return b}else{if(e<0.00001){e=0}}c.filter=f(d)+"alpha(opacity="+(e*100)+")";return b};Element._attributeTranslations=(function(){var b="className";var a="for";var c=document.createElement("div");c.setAttribute(b,"x");if(c.className!=="x"){c.setAttribute("class","x");if(c.className==="x"){b="class"}}c=null;c=document.createElement("label");c.setAttribute(a,"x");if(c.htmlFor!=="x"){c.setAttribute("htmlFor","x");if(c.htmlFor==="x"){a="htmlFor"}}c=null;return{read:{names:{"class":b,className:b,"for":a,htmlFor:a},values:{_getAttr:function(d,e){return d.getAttribute(e)},_getAttr2:function(d,e){return d.getAttribute(e,2)},_getAttrNode:function(d,f){var e=d.getAttributeNode(f);return e?e.value:""},_getEv:(function(){var d=document.createElement("div");d.onclick=Prototype.emptyFunction;var g=d.getAttribute("onclick");var e;if(String(g).indexOf("{")>-1){e=function(f,h){h=f.getAttribute(h);if(!h){return null}h=h.toString();h=h.split("{")[1];h=h.split("}")[0];return h.strip()}}else{if(g===""){e=function(f,h){h=f.getAttribute(h);if(!h){return null}return h.strip()}}}d=null;return e})(),_flag:function(d,e){return $(d).hasAttribute(e)?e:null},style:function(d){return d.style.cssText.toLowerCase()},title:function(d){return d.title}}}}})();Element._attributeTranslations.write={names:Object.extend({cellpadding:"cellPadding",cellspacing:"cellSpacing"},Element._attributeTranslations.read.names),values:{checked:function(a,b){a.checked=!!b},style:function(a,b){a.style.cssText=b?b:""}}};Element._attributeTranslations.has={};$w("colSpan rowSpan vAlign dateTime accessKey tabIndex encType maxLength readOnly longDesc frameBorder").each(function(a){Element._attributeTranslations.write.names[a.toLowerCase()]=a;Element._attributeTranslations.has[a.toLowerCase()]=a});(function(a){Object.extend(a,{href:a._getAttr2,src:a._getAttr2,type:a._getAttr,action:a._getAttrNode,disabled:a._flag,checked:a._flag,readonly:a._flag,multiple:a._flag,onload:a._getEv,onunload:a._getEv,onclick:a._getEv,ondblclick:a._getEv,onmousedown:a._getEv,onmouseup:a._getEv,onmouseover:a._getEv,onmousemove:a._getEv,onmouseout:a._getEv,onfocus:a._getEv,onblur:a._getEv,onkeypress:a._getEv,onkeydown:a._getEv,onkeyup:a._getEv,onsubmit:a._getEv,onreset:a._getEv,onselect:a._getEv,onchange:a._getEv})})(Element._attributeTranslations.read.values);if(Prototype.BrowserFeatures.ElementExtensions){(function(){function a(e){var b=e.getElementsByTagName("*"),d=[];for(var c=0,f;f=b[c];c++){if(f.tagName!=="!"){d.push(f)}}return d}Element.Methods.down=function(c,d,b){c=$(c);if(arguments.length==1){return c.firstDescendant()}return Object.isNumber(d)?a(c)[d]:Element.select(c,d)[b||0]}})()}}else{if(Prototype.Browser.Gecko&&/rv:1\.8\.0/.test(navigator.userAgent)){Element.Methods.setOpacity=function(a,b){a=$(a);a.style.opacity=(b==1)?0.999999:(b==="")?"":(b<0.00001)?0:b;return a}}else{if(Prototype.Browser.WebKit){Element.Methods.setOpacity=function(a,b){a=$(a);a.style.opacity=(b==1||b==="")?"":(b<0.00001)?0:b;if(b==1){if(a.tagName.toUpperCase()=="IMG"&&a.width){a.width++;a.width--}else{try{var d=document.createTextNode(" ");a.appendChild(d);a.removeChild(d)}catch(c){}}}return a};Element.Methods.cumulativeOffset=function(b){var a=0,c=0;do{a+=b.offsetTop||0;c+=b.offsetLeft||0;if(b.offsetParent==document.body){if(Element.getStyle(b,"position")=="absolute"){break}}b=b.offsetParent}while(b);return Element._returnOffset(c,a)}}}}}if("outerHTML" in document.documentElement){Element.Methods.replace=function(c,e){c=$(c);if(e&&e.toElement){e=e.toElement()}if(Object.isElement(e)){c.parentNode.replaceChild(e,c);return c}e=Object.toHTML(e);var d=c.parentNode,b=d.tagName.toUpperCase();if(Element._insertionTranslations.tags[b]){var f=c.next();var a=Element._getContentFromAnonymousElement(b,e.stripScripts());d.removeChild(c);if(f){a.each(function(g){d.insertBefore(g,f)})}else{a.each(function(g){d.appendChild(g)})}}else{c.outerHTML=e.stripScripts()}e.evalScripts.bind(e).defer();return c}}Element._returnOffset=function(b,c){var a=[b,c];a.left=b;a.top=c;return a};Element._getContentFromAnonymousElement=function(c,b){var d=new Element("div"),a=Element._insertionTranslations.tags[c];if(a){d.innerHTML=a[0]+b+a[1];a[2].times(function(){d=d.firstChild})}else{d.innerHTML=b}return $A(d.childNodes)};Element._insertionTranslations={before:function(a,b){a.parentNode.insertBefore(b,a)},top:function(a,b){a.insertBefore(b,a.firstChild)},bottom:function(a,b){a.appendChild(b)},after:function(a,b){a.parentNode.insertBefore(b,a.nextSibling)},tags:{TABLE:["<table>","</table>",1],TBODY:["<table><tbody>","</tbody></table>",2],TR:["<table><tbody><tr>","</tr></tbody></table>",3],TD:["<table><tbody><tr><td>","</td></tr></tbody></table>",4],SELECT:["<select>","</select>",1]}};(function(){var a=Element._insertionTranslations.tags;Object.extend(a,{THEAD:a.TBODY,TFOOT:a.TBODY,TH:a.TD})})();Element.Methods.Simulated={hasAttribute:function(a,c){c=Element._attributeTranslations.has[c]||c;var b=$(a).getAttributeNode(c);return !!(b&&b.specified)}};Element.Methods.ByTag={};Object.extend(Element,Element.Methods);(function(a){if(!Prototype.BrowserFeatures.ElementExtensions&&a.__proto__){window.HTMLElement={};window.HTMLElement.prototype=a.__proto__;Prototype.BrowserFeatures.ElementExtensions=true}a=null})(document.createElement("div"));Element.extend=(function(){function c(g){if(typeof window.Element!="undefined"){var j=window.Element.prototype;if(j){var l="_"+(Math.random()+"").slice(2);var h=document.createElement(g);j[l]="x";var k=(h[l]!=="x");delete j[l];h=null;return k}}return false}function b(h,g){for(var k in g){var j=g[k];if(Object.isFunction(j)&&!(k in h)){h[k]=j.methodize()}}}var d=c("object");if(Prototype.BrowserFeatures.SpecificElementExtensions){if(d){return function(h){if(h&&typeof h._extendedByPrototype=="undefined"){var g=h.tagName;if(g&&(/^(?:object|applet|embed)$/i.test(g))){b(h,Element.Methods);b(h,Element.Methods.Simulated);b(h,Element.Methods.ByTag[g.toUpperCase()])}}return h}}return Prototype.K}var a={},e=Element.Methods.ByTag;var f=Object.extend(function(j){if(!j||typeof j._extendedByPrototype!="undefined"||j.nodeType!=1||j==window){return j}var g=Object.clone(a),h=j.tagName.toUpperCase();if(e[h]){Object.extend(g,e[h])}b(j,g);j._extendedByPrototype=Prototype.emptyFunction;return j},{refresh:function(){if(!Prototype.BrowserFeatures.ElementExtensions){Object.extend(a,Element.Methods);Object.extend(a,Element.Methods.Simulated)}}});f.refresh();return f})();Element.hasAttribute=function(a,b){if(a.hasAttribute){return a.hasAttribute(b)}return Element.Methods.Simulated.hasAttribute(a,b)};Element.addMethods=function(c){var j=Prototype.BrowserFeatures,d=Element.Methods.ByTag;if(!c){Object.extend(Form,Form.Methods);Object.extend(Form.Element,Form.Element.Methods);Object.extend(Element.Methods.ByTag,{FORM:Object.clone(Form.Methods),INPUT:Object.clone(Form.Element.Methods),SELECT:Object.clone(Form.Element.Methods),TEXTAREA:Object.clone(Form.Element.Methods)})}if(arguments.length==2){var b=c;c=arguments[1]}if(!b){Object.extend(Element.Methods,c||{})}else{if(Object.isArray(b)){b.each(g)}else{g(b)}}function g(l){l=l.toUpperCase();if(!Element.Methods.ByTag[l]){Element.Methods.ByTag[l]={}}Object.extend(Element.Methods.ByTag[l],c)}function a(n,m,l){l=l||false;for(var p in n){var o=n[p];if(!Object.isFunction(o)){continue}if(!l||!(p in m)){m[p]=o.methodize()}}}function e(o){var l;var n={OPTGROUP:"OptGroup",TEXTAREA:"TextArea",P:"Paragraph",FIELDSET:"FieldSet",UL:"UList",OL:"OList",DL:"DList",DIR:"Directory",H1:"Heading",H2:"Heading",H3:"Heading",H4:"Heading",H5:"Heading",H6:"Heading",Q:"Quote",INS:"Mod",DEL:"Mod",A:"Anchor",IMG:"Image",CAPTION:"TableCaption",COL:"TableCol",COLGROUP:"TableCol",THEAD:"TableSection",TFOOT:"TableSection",TBODY:"TableSection",TR:"TableRow",TH:"TableCell",TD:"TableCell",FRAMESET:"FrameSet",IFRAME:"IFrame"};if(n[o]){l="HTML"+n[o]+"Element"}if(window[l]){return window[l]}l="HTML"+o+"Element";if(window[l]){return window[l]}l="HTML"+o.capitalize()+"Element";if(window[l]){return window[l]}var m=document.createElement(o);var p=m.__proto__||m.constructor.prototype;m=null;return p}var h=window.HTMLElement?HTMLElement.prototype:Element.prototype;if(j.ElementExtensions){a(Element.Methods,h);a(Element.Methods.Simulated,h,true)}if(j.SpecificElementExtensions){for(var k in Element.Methods.ByTag){var f=e(k);if(Object.isUndefined(f)){continue}a(d[k],f.prototype)}}Object.extend(Element,Element.Methods);delete Element.ByTag;if(Element.extend.refresh){Element.extend.refresh()}Element.cache={}};document.viewport={getDimensions:function(){return{width:this.getWidth(),height:this.getHeight()}},getScrollOffsets:function(){return Element._returnOffset(window.pageXOffset||document.documentElement.scrollLeft||document.body.scrollLeft,window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop)}};(function(b){var g=Prototype.Browser,e=document,c,d={};function a(){if(g.WebKit&&!e.evaluate){return document}if(g.Opera&&window.parseFloat(window.opera.version())<9.5){return document.body}return document.documentElement}function f(h){if(!c){c=a()}d[h]="client"+h;b["get"+h]=function(){return c[d[h]]};return b["get"+h]()}b.getWidth=f.curry("Width");b.getHeight=f.curry("Height")})(document.viewport);Element.Storage={UID:1};Element.addMethods({getStorage:function(b){if(!(b=$(b))){return}var a;if(b===window){a=0}else{if(typeof b._prototypeUID==="undefined"){b._prototypeUID=[Element.Storage.UID++]}a=b._prototypeUID[0]}if(!Element.Storage[a]){Element.Storage[a]=$H()}return Element.Storage[a]},store:function(b,a,c){if(!(b=$(b))){return}if(arguments.length===2){Element.getStorage(b).update(a)}else{Element.getStorage(b).set(a,c)}return b},retrieve:function(c,b,a){if(!(c=$(c))){return}var e=Element.getStorage(c),d=e.get(b);if(Object.isUndefined(d)){e.set(b,a);d=a}return d},clone:function(c,a){if(!(c=$(c))){return}var e=c.cloneNode(a);e._prototypeUID=void 0;if(a){var d=Element.select(e,"*"),b=d.length;while(b--){d[b]._prototypeUID=void 0}}return Element.extend(e)}});var Selector=Class.create({initialize:function(a){this.expression=a.strip();if(this.shouldUseSelectorsAPI()){this.mode="selectorsAPI"}else{if(this.shouldUseXPath()){this.mode="xpath";this.compileXPathMatcher()}else{this.mode="normal";this.compileMatcher()}}},shouldUseXPath:(function(){var a=(function(){var e=false;if(document.evaluate&&window.XPathResult){var d=document.createElement("div");d.innerHTML="<ul><li></li></ul><div><ul><li></li></ul></div>";var c=".//*[local-name()='ul' or local-name()='UL']//*[local-name()='li' or local-name()='LI']";var b=document.evaluate(c,d,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null);e=(b.snapshotLength!==2);d=null}return e})();return function(){if(!Prototype.BrowserFeatures.XPath){return false}var b=this.expression;if(Prototype.Browser.WebKit&&(b.include("-of-type")||b.include(":empty"))){return false}if((/(\[[\w-]*?:|:checked)/).test(b)){return false}if(a){return false}return true}})(),shouldUseSelectorsAPI:function(){if(!Prototype.BrowserFeatures.SelectorsAPI){return false}if(Selector.CASE_INSENSITIVE_CLASS_NAMES){return false}if(!Selector._div){Selector._div=new Element("div")}try{Selector._div.querySelector(this.expression)}catch(a){return false}return true},compileMatcher:function(){var e=this.expression,ps=Selector.patterns,h=Selector.handlers,c=Selector.criteria,le,p,m,len=ps.length,name;if(Selector._cache[e]){this.matcher=Selector._cache[e];return}this.matcher=["this.matcher = function(root) {","var r = root, h = Selector.handlers, c = false, n;"];while(e&&le!=e&&(/\S/).test(e)){le=e;for(var i=0;i<len;i++){p=ps[i].re;name=ps[i].name;if(m=e.match(p)){this.matcher.push(Object.isFunction(c[name])?c[name](m):new Template(c[name]).evaluate(m));e=e.replace(m[0],"");break}}}this.matcher.push("return h.unique(n);\n}");eval(this.matcher.join("\n"));Selector._cache[this.expression]=this.matcher},compileXPathMatcher:function(){var h=this.expression,j=Selector.patterns,c=Selector.xpath,g,b,a=j.length,d;if(Selector._cache[h]){this.xpath=Selector._cache[h];return}this.matcher=[".//*"];while(h&&g!=h&&(/\S/).test(h)){g=h;for(var f=0;f<a;f++){d=j[f].name;if(b=h.match(j[f].re)){this.matcher.push(Object.isFunction(c[d])?c[d](b):new Template(c[d]).evaluate(b));h=h.replace(b[0],"");break}}}this.xpath=this.matcher.join("");Selector._cache[this.expression]=this.xpath},findElements:function(a){a=a||document;var c=this.expression,b;switch(this.mode){case"selectorsAPI":if(a!==document){var d=a.id,f=$(a).identify();f=f.replace(/([\.:])/g,"\\$1");c="#"+f+" "+c}b=$A(a.querySelectorAll(c)).map(Element.extend);a.id=d;return b;case"xpath":return document._getElementsByXPath(this.xpath,a);default:return this.matcher(a)}},match:function(k){this.tokens=[];var q=this.expression,a=Selector.patterns,f=Selector.assertions;var b,d,g,o=a.length,c;while(q&&b!==q&&(/\S/).test(q)){b=q;for(var j=0;j<o;j++){d=a[j].re;c=a[j].name;if(g=q.match(d)){if(f[c]){this.tokens.push([c,Object.clone(g)]);q=q.replace(g[0],"")}else{return this.findElements(document).include(k)}}}}var n=true,c,l;for(var j=0,h;h=this.tokens[j];j++){c=h[0],l=h[1];if(!Selector.assertions[c](k,l)){n=false;break}}return n},toString:function(){return this.expression},inspect:function(){return"#<Selector:"+this.expression.inspect()+">"}});if(Prototype.BrowserFeatures.SelectorsAPI&&document.compatMode==="BackCompat"){Selector.CASE_INSENSITIVE_CLASS_NAMES=(function(){var c=document.createElement("div"),a=document.createElement("span");c.id="prototype_test_id";a.className="Test";c.appendChild(a);var b=(c.querySelector("#prototype_test_id .test")!==null);c=a=null;return b})()}Object.extend(Selector,{_cache:{},xpath:{descendant:"//*",child:"/*",adjacent:"/following-sibling::*[1]",laterSibling:"/following-sibling::*",tagName:function(a){if(a[1]=="*"){return""}return"[local-name()='"+a[1].toLowerCase()+"' or local-name()='"+a[1].toUpperCase()+"']"},className:"[contains(concat(' ', @class, ' '), ' #{1} ')]",id:"[@id='#{1}']",attrPresence:function(a){a[1]=a[1].toLowerCase();return new Template("[@#{1}]").evaluate(a)},attr:function(a){a[1]=a[1].toLowerCase();a[3]=a[5]||a[6];return new Template(Selector.xpath.operators[a[2]]).evaluate(a)},pseudo:function(a){var b=Selector.xpath.pseudos[a[1]];if(!b){return""}if(Object.isFunction(b)){return b(a)}return new Template(Selector.xpath.pseudos[a[1]]).evaluate(a)},operators:{"=":"[@#{1}='#{3}']","!=":"[@#{1}!='#{3}']","^=":"[starts-with(@#{1}, '#{3}')]","$=":"[substring(@#{1}, (string-length(@#{1}) - string-length('#{3}') + 1))='#{3}']","*=":"[contains(@#{1}, '#{3}')]","~=":"[contains(concat(' ', @#{1}, ' '), ' #{3} ')]","|=":"[contains(concat('-', @#{1}, '-'), '-#{3}-')]"},pseudos:{"first-child":"[not(preceding-sibling::*)]","last-child":"[not(following-sibling::*)]","only-child":"[not(preceding-sibling::* or following-sibling::*)]",empty:"[count(*) = 0 and (count(text()) = 0)]",checked:"[@checked]",disabled:"[(@disabled) and (@type!='hidden')]",enabled:"[not(@disabled) and (@type!='hidden')]",not:function(f){var j=f[6],c=Selector.patterns,k=Selector.xpath,a,l,h=c.length,b;var d=[];while(j&&a!=j&&(/\S/).test(j)){a=j;for(var g=0;g<h;g++){b=c[g].name;if(f=j.match(c[g].re)){l=Object.isFunction(k[b])?k[b](f):new Template(k[b]).evaluate(f);d.push("("+l.substring(1,l.length-1)+")");j=j.replace(f[0],"");break}}}return"[not("+d.join(" and ")+")]"},"nth-child":function(a){return Selector.xpath.pseudos.nth("(count(./preceding-sibling::*) + 1) ",a)},"nth-last-child":function(a){return Selector.xpath.pseudos.nth("(count(./following-sibling::*) + 1) ",a)},"nth-of-type":function(a){return Selector.xpath.pseudos.nth("position() ",a)},"nth-last-of-type":function(a){return Selector.xpath.pseudos.nth("(last() + 1 - position()) ",a)},"first-of-type":function(a){a[6]="1";return Selector.xpath.pseudos["nth-of-type"](a)},"last-of-type":function(a){a[6]="1";return Selector.xpath.pseudos["nth-last-of-type"](a)},"only-of-type":function(a){var b=Selector.xpath.pseudos;return b["first-of-type"](a)+b["last-of-type"](a)},nth:function(g,e){var h,j=e[6],d;if(j=="even"){j="2n+0"}if(j=="odd"){j="2n+1"}if(h=j.match(/^(\d+)$/)){return"["+g+"= "+h[1]+"]"}if(h=j.match(/^(-?\d*)?n(([+-])(\d+))?/)){if(h[1]=="-"){h[1]=-1}var f=h[1]?Number(h[1]):1;var c=h[2]?Number(h[2]):0;d="[((#{fragment} - #{b}) mod #{a} = 0) and ((#{fragment} - #{b}) div #{a} >= 0)]";return new Template(d).evaluate({fragment:g,a:f,b:c})}}}},criteria:{tagName:'n = h.tagName(n, r, "#{1}", c);      c = false;',className:'n = h.className(n, r, "#{1}", c);    c = false;',id:'n = h.id(n, r, "#{1}", c);           c = false;',attrPresence:'n = h.attrPresence(n, r, "#{1}", c); c = false;',attr:function(a){a[3]=(a[5]||a[6]);return new Template('n = h.attr(n, r, "#{1}", "#{3}", "#{2}", c); c = false;').evaluate(a)},pseudo:function(a){if(a[6]){a[6]=a[6].replace(/"/g,'\\"')}return new Template('n = h.pseudo(n, "#{1}", "#{6}", r, c); c = false;').evaluate(a)},descendant:'c = "descendant";',child:'c = "child";',adjacent:'c = "adjacent";',laterSibling:'c = "laterSibling";'},patterns:[{name:"laterSibling",re:/^\s*~\s*/},{name:"child",re:/^\s*>\s*/},{name:"adjacent",re:/^\s*\+\s*/},{name:"descendant",re:/^\s/},{name:"tagName",re:/^\s*(\*|[\w\-]+)(\b|$)?/},{name:"id",re:/^#([\w\-\*]+)(\b|$)/},{name:"className",re:/^\.([\w\-\*]+)(\b|$)/},{name:"pseudo",re:/^:((first|last|nth|nth-last|only)(-child|-of-type)|empty|checked|(en|dis)abled|not)(\((.*?)\))?(\b|$|(?=\s|[:+~>]))/},{name:"attrPresence",re:/^\[((?:[\w-]+:)?[\w-]+)\]/},{name:"attr",re:/\[((?:[\w-]*:)?[\w-]+)\s*(?:([!^$*~|]?=)\s*((['"])([^\4]*?)\4|([^'"][^\]]*?)))?\]/}],assertions:{tagName:function(a,b){return b[1].toUpperCase()==a.tagName.toUpperCase()},className:function(a,b){return Element.hasClassName(a,b[1])},id:function(a,b){return a.id===b[1]},attrPresence:function(a,b){return Element.hasAttribute(a,b[1])},attr:function(b,c){var a=Element.readAttribute(b,c[1]);return a&&Selector.operators[c[2]](a,c[5]||c[6])}},handlers:{concat:function(d,c){for(var e=0,f;f=c[e];e++){d.push(f)}return d},mark:function(a){var d=Prototype.emptyFunction;for(var b=0,c;c=a[b];b++){c._countedByPrototype=d}return a},unmark:(function(){var a=(function(){var b=document.createElement("div"),e=false,d="_countedByPrototype",c="x";b[d]=c;e=(b.getAttribute(d)===c);b=null;return e})();return a?function(b){for(var c=0,d;d=b[c];c++){d.removeAttribute("_countedByPrototype")}return b}:function(b){for(var c=0,d;d=b[c];c++){d._countedByPrototype=void 0}return b}})(),index:function(a,d,g){a._countedByPrototype=Prototype.emptyFunction;if(d){for(var b=a.childNodes,e=b.length-1,c=1;e>=0;e--){var f=b[e];if(f.nodeType==1&&(!g||f._countedByPrototype)){f.nodeIndex=c++}}}else{for(var e=0,c=1,b=a.childNodes;f=b[e];e++){if(f.nodeType==1&&(!g||f._countedByPrototype)){f.nodeIndex=c++}}}},unique:function(b){if(b.length==0){return b}var d=[],e;for(var c=0,a=b.length;c<a;c++){if(typeof(e=b[c])._countedByPrototype=="undefined"){e._countedByPrototype=Prototype.emptyFunction;d.push(Element.extend(e))}}return Selector.handlers.unmark(d)},descendant:function(a){var d=Selector.handlers;for(var c=0,b=[],e;e=a[c];c++){d.concat(b,e.getElementsByTagName("*"))}return b},child:function(a){var e=Selector.handlers;for(var d=0,c=[],f;f=a[d];d++){for(var b=0,g;g=f.childNodes[b];b++){if(g.nodeType==1&&g.tagName!="!"){c.push(g)}}}return c},adjacent:function(a){for(var c=0,b=[],e;e=a[c];c++){var d=this.nextElementSibling(e);if(d){b.push(d)}}return b},laterSibling:function(a){var d=Selector.handlers;for(var c=0,b=[],e;e=a[c];c++){d.concat(b,Element.nextSiblings(e))}return b},nextElementSibling:function(a){while(a=a.nextSibling){if(a.nodeType==1){return a}}return null},previousElementSibling:function(a){while(a=a.previousSibling){if(a.nodeType==1){return a}}return null},tagName:function(a,j,c,b){var k=c.toUpperCase();var e=[],g=Selector.handlers;if(a){if(b){if(b=="descendant"){for(var f=0,d;d=a[f];f++){g.concat(e,d.getElementsByTagName(c))}return e}else{a=this[b](a)}if(c=="*"){return a}}for(var f=0,d;d=a[f];f++){if(d.tagName.toUpperCase()===k){e.push(d)}}return e}else{return j.getElementsByTagName(c)}},id:function(a,l,b,c){var k=$(b),g=Selector.handlers;if(l==document){if(!k){return[]}if(!a){return[k]}}else{if(!l.sourceIndex||l.sourceIndex<1){var a=l.getElementsByTagName("*");for(var e=0,d;d=a[e];e++){if(d.id===b){return[d]}}}}if(a){if(c){if(c=="child"){for(var f=0,d;d=a[f];f++){if(k.parentNode==d){return[k]}}}else{if(c=="descendant"){for(var f=0,d;d=a[f];f++){if(Element.descendantOf(k,d)){return[k]}}}else{if(c=="adjacent"){for(var f=0,d;d=a[f];f++){if(Selector.handlers.previousElementSibling(k)==d){return[k]}}}else{a=g[c](a)}}}}for(var f=0,d;d=a[f];f++){if(d==k){return[k]}}return[]}return(k&&Element.descendantOf(k,l))?[k]:[]},className:function(b,a,c,d){if(b&&d){b=this[d](b)}return Selector.handlers.byClassName(b,a,c)},byClassName:function(c,b,f){if(!c){c=Selector.handlers.descendant([b])}var h=" "+f+" ";for(var e=0,d=[],g,a;g=c[e];e++){a=g.className;if(a.length==0){continue}if(a==f||(" "+a+" ").include(h)){d.push(g)}}return d},attrPresence:function(c,b,a,g){if(!c){c=b.getElementsByTagName("*")}if(c&&g){c=this[g](c)}var e=[];for(var d=0,f;f=c[d];d++){if(Element.hasAttribute(f,a)){e.push(f)}}return e},attr:function(a,j,h,k,c,b){if(!a){a=j.getElementsByTagName("*")}if(a&&b){a=this[b](a)}var l=Selector.operators[c],f=[];for(var e=0,d;d=a[e];e++){var g=Element.readAttribute(d,h);if(g===null){continue}if(l(g,k)){f.push(d)}}return f},pseudo:function(b,c,e,a,d){if(b&&d){b=this[d](b)}if(!b){b=a.getElementsByTagName("*")}return Selector.pseudos[c](b,e,a)}},pseudos:{"first-child":function(b,f,a){for(var d=0,c=[],e;e=b[d];d++){if(Selector.handlers.previousElementSibling(e)){continue}c.push(e)}return c},"last-child":function(b,f,a){for(var d=0,c=[],e;e=b[d];d++){if(Selector.handlers.nextElementSibling(e)){continue}c.push(e)}return c},"only-child":function(b,g,a){var e=Selector.handlers;for(var d=0,c=[],f;f=b[d];d++){if(!e.previousElementSibling(f)&&!e.nextElementSibling(f)){c.push(f)}}return c},"nth-child":function(b,c,a){return Selector.pseudos.nth(b,c,a)},"nth-last-child":function(b,c,a){return Selector.pseudos.nth(b,c,a,true)},"nth-of-type":function(b,c,a){return Selector.pseudos.nth(b,c,a,false,true)},"nth-last-of-type":function(b,c,a){return Selector.pseudos.nth(b,c,a,true,true)},"first-of-type":function(b,c,a){return Selector.pseudos.nth(b,"1",a,false,true)},"last-of-type":function(b,c,a){return Selector.pseudos.nth(b,"1",a,true,true)},"only-of-type":function(b,d,a){var c=Selector.pseudos;return c["last-of-type"](c["first-of-type"](b,d,a),d,a)},getIndices:function(d,c,e){if(d==0){return c>0?[c]:[]}return $R(1,e).inject([],function(a,b){if(0==(b-c)%d&&(b-c)/d>=0){a.push(b)}return a})},nth:function(c,s,u,r,e){if(c.length==0){return[]}if(s=="even"){s="2n+0"}if(s=="odd"){s="2n+1"}var q=Selector.handlers,p=[],d=[],g;q.mark(c);for(var o=0,f;f=c[o];o++){if(!f.parentNode._countedByPrototype){q.index(f.parentNode,r,e);d.push(f.parentNode)}}if(s.match(/^\d+$/)){s=Number(s);for(var o=0,f;f=c[o];o++){if(f.nodeIndex==s){p.push(f)}}}else{if(g=s.match(/^(-?\d*)?n(([+-])(\d+))?/)){if(g[1]=="-"){g[1]=-1}var v=g[1]?Number(g[1]):1;var t=g[2]?Number(g[2]):0;var w=Selector.pseudos.getIndices(v,t,c.length);for(var o=0,f,k=w.length;f=c[o];o++){for(var n=0;n<k;n++){if(f.nodeIndex==w[n]){p.push(f)}}}}}q.unmark(c);q.unmark(d);return p},empty:function(b,f,a){for(var d=0,c=[],e;e=b[d];d++){if(e.tagName=="!"||e.firstChild){continue}c.push(e)}return c},not:function(a,d,k){var g=Selector.handlers,l,c;var j=new Selector(d).findElements(k);g.mark(j);for(var f=0,e=[],b;b=a[f];f++){if(!b._countedByPrototype){e.push(b)}}g.unmark(j);return e},enabled:function(b,f,a){for(var d=0,c=[],e;e=b[d];d++){if(!e.disabled&&(!e.type||e.type!=="hidden")){c.push(e)}}return c},disabled:function(b,f,a){for(var d=0,c=[],e;e=b[d];d++){if(e.disabled){c.push(e)}}return c},checked:function(b,f,a){for(var d=0,c=[],e;e=b[d];d++){if(e.checked){c.push(e)}}return c}},operators:{"=":function(b,a){return b==a},"!=":function(b,a){return b!=a},"^=":function(b,a){return b==a||b&&b.startsWith(a)},"$=":function(b,a){return b==a||b&&b.endsWith(a)},"*=":function(b,a){return b==a||b&&b.include(a)},"~=":function(b,a){return(" "+b+" ").include(" "+a+" ")},"|=":function(b,a){return("-"+(b||"").toUpperCase()+"-").include("-"+(a||"").toUpperCase()+"-")}},split:function(b){var a=[];b.scan(/(([\w#:.~>+()\s-]+|\*|\[.*?\])+)\s*(,|$)/,function(c){a.push(c[1].strip())});return a},matchElements:function(f,g){var e=$$(g),d=Selector.handlers;d.mark(e);for(var c=0,b=[],a;a=f[c];c++){if(a._countedByPrototype){b.push(a)}}d.unmark(e);return b},findElement:function(b,c,a){if(Object.isNumber(c)){a=c;c=false}return Selector.matchElements(b,c||"*")[a||0]},findChildElements:function(e,g){g=Selector.split(g.join(","));var d=[],f=Selector.handlers;for(var c=0,b=g.length,a;c<b;c++){a=new Selector(g[c].strip());f.concat(d,a.findElements(e))}return(b>1)?f.unique(d):d}});if(Prototype.Browser.IE){Object.extend(Selector.handlers,{concat:function(d,c){for(var e=0,f;f=c[e];e++){if(f.tagName!=="!"){d.push(f)}}return d}})}function $$(){return Selector.findChildElements(document,$A(arguments))}var Form={reset:function(a){a=$(a);a.reset();return a},serializeElements:function(g,b){if(typeof b!="object"){b={hash:!!b}}else{if(Object.isUndefined(b.hash)){b.hash=true}}var c,f,a=false,e=b.submit;var d=g.inject({},function(h,j){if(!j.disabled&&j.name){c=j.name;f=$(j).getValue();if(f!=null&&j.type!="file"&&(j.type!="submit"||(!a&&e!==false&&(!e||c==e)&&(a=true)))){if(c in h){if(!Object.isArray(h[c])){h[c]=[h[c]]}h[c].push(f)}else{h[c]=f}}}return h});return b.hash?d:Object.toQueryString(d)}};Form.Methods={serialize:function(b,a){return Form.serializeElements(Form.getElements(b),a)},getElements:function(e){var f=$(e).getElementsByTagName("*"),d,a=[],c=Form.Element.Serializers;for(var b=0;d=f[b];b++){a.push(d)}return a.inject([],function(g,h){if(c[h.tagName.toLowerCase()]){g.push(Element.extend(h))}return g})},getInputs:function(g,c,d){g=$(g);var a=g.getElementsByTagName("input");if(!c&&!d){return $A(a).map(Element.extend)}for(var e=0,h=[],f=a.length;e<f;e++){var b=a[e];if((c&&b.type!=c)||(d&&b.name!=d)){continue}h.push(Element.extend(b))}return h},disable:function(a){a=$(a);Form.getElements(a).invoke("disable");return a},enable:function(a){a=$(a);Form.getElements(a).invoke("enable");return a},findFirstElement:function(b){var c=$(b).getElements().findAll(function(d){return"hidden"!=d.type&&!d.disabled});var a=c.findAll(function(d){return d.hasAttribute("tabIndex")&&d.tabIndex>=0}).sortBy(function(d){return d.tabIndex}).first();return a?a:c.find(function(d){return/^(?:input|select|textarea)$/i.test(d.tagName)})},focusFirstElement:function(a){a=$(a);a.findFirstElement().activate();return a},request:function(b,a){b=$(b),a=Object.clone(a||{});var d=a.parameters,c=b.readAttribute("action")||"";if(c.blank()){c=window.location.href}a.parameters=b.serialize(true);if(d){if(Object.isString(d)){d=d.toQueryParams()}Object.extend(a.parameters,d)}if(b.hasAttribute("method")&&!a.method){a.method=b.method}return new Ajax.Request(c,a)}};Form.Element={focus:function(a){$(a).focus();return a},select:function(a){$(a).select();return a}};Form.Element.Methods={serialize:function(a){a=$(a);if(!a.disabled&&a.name){var b=a.getValue();if(b!=undefined){var c={};c[a.name]=b;return Object.toQueryString(c)}}return""},getValue:function(a){a=$(a);var b=a.tagName.toLowerCase();return Form.Element.Serializers[b](a)},setValue:function(a,b){a=$(a);var c=a.tagName.toLowerCase();Form.Element.Serializers[c](a,b);return a},clear:function(a){$(a).value="";return a},present:function(a){return $(a).value!=""},activate:function(a){a=$(a);try{a.focus();if(a.select&&(a.tagName.toLowerCase()!="input"||!(/^(?:button|reset|submit)$/i.test(a.type)))){a.select()}}catch(b){}return a},disable:function(a){a=$(a);a.disabled=true;return a},enable:function(a){a=$(a);a.disabled=false;return a}};var Field=Form.Element;var $F=Form.Element.Methods.getValue;Form.Element.Serializers={input:function(a,b){switch(a.type.toLowerCase()){case"checkbox":case"radio":return Form.Element.Serializers.inputSelector(a,b);default:return Form.Element.Serializers.textarea(a,b)}},inputSelector:function(a,b){if(Object.isUndefined(b)){return a.checked?a.value:null}else{a.checked=!!b}},textarea:function(a,b){if(Object.isUndefined(b)){return a.value}else{a.value=b}},select:function(c,f){if(Object.isUndefined(f)){return this[c.type=="select-one"?"selectOne":"selectMany"](c)}else{var b,d,g=!Object.isArray(f);for(var a=0,e=c.length;a<e;a++){b=c.options[a];d=this.optionValue(b);if(g){if(d==f){b.selected=true;return}}else{b.selected=f.include(d)}}}},selectOne:function(b){var a=b.selectedIndex;return a>=0?this.optionValue(b.options[a]):null},selectMany:function(d){var a,e=d.length;if(!e){return null}for(var c=0,a=[];c<e;c++){var b=d.options[c];if(b.selected){a.push(this.optionValue(b))}}return a},optionValue:function(a){return Element.extend(a).hasAttribute("value")?a.value:a.text}};Abstract.TimedObserver=Class.create(PeriodicalExecuter,{initialize:function($super,a,b,c){$super(c,b);this.element=$(a);this.lastValue=this.getValue()},execute:function(){var a=this.getValue();if(Object.isString(this.lastValue)&&Object.isString(a)?this.lastValue!=a:String(this.lastValue)!=String(a)){this.callback(this.element,a);this.lastValue=a}}});Form.Element.Observer=Class.create(Abstract.TimedObserver,{getValue:function(){return Form.Element.getValue(this.element)}});Form.Observer=Class.create(Abstract.TimedObserver,{getValue:function(){return Form.serialize(this.element)}});Abstract.EventObserver=Class.create({initialize:function(a,b){this.element=$(a);this.callback=b;this.lastValue=this.getValue();if(this.element.tagName.toLowerCase()=="form"){this.registerFormCallbacks()}else{this.registerCallback(this.element)}},onElementEvent:function(){var a=this.getValue();if(this.lastValue!=a){this.callback(this.element,a);this.lastValue=a}},registerFormCallbacks:function(){Form.getElements(this.element).each(this.registerCallback,this)},registerCallback:function(a){if(a.type){switch(a.type.toLowerCase()){case"checkbox":case"radio":Event.observe(a,"click",this.onElementEvent.bind(this));break;default:Event.observe(a,"change",this.onElementEvent.bind(this));break}}}});Form.Element.EventObserver=Class.create(Abstract.EventObserver,{getValue:function(){return Form.Element.getValue(this.element)}});Form.EventObserver=Class.create(Abstract.EventObserver,{getValue:function(){return Form.serialize(this.element)}});(function(){var w={KEY_BACKSPACE:8,KEY_TAB:9,KEY_RETURN:13,KEY_ESC:27,KEY_LEFT:37,KEY_UP:38,KEY_RIGHT:39,KEY_DOWN:40,KEY_DELETE:46,KEY_HOME:36,KEY_END:35,KEY_PAGEUP:33,KEY_PAGEDOWN:34,KEY_INSERT:45,cache:{}};var e=document.documentElement;var x="onmouseenter" in e&&"onmouseleave" in e;var p;if(Prototype.Browser.IE){var h={0:1,1:4,2:2};p=function(z,y){return z.button===h[y]}}else{if(Prototype.Browser.WebKit){p=function(z,y){switch(y){case 0:return z.which==1&&!z.metaKey;case 1:return z.which==1&&z.metaKey;default:return false}}}else{p=function(z,y){return z.which?(z.which===y+1):(z.button===y)}}}function s(y){return p(y,0)}function r(y){return p(y,1)}function l(y){return p(y,2)}function c(A){A=w.extend(A);var z=A.target,y=A.type,B=A.currentTarget;if(B&&B.tagName){if(y==="load"||y==="error"||(y==="click"&&B.tagName.toLowerCase()==="input"&&B.type==="radio")){z=B}}if(z.nodeType==Node.TEXT_NODE){z=z.parentNode}return Element.extend(z)}function n(z,B){var y=w.element(z);if(!B){return y}var A=[y].concat(y.ancestors());return Selector.findElement(A,B,0)}function q(y){return{x:b(y),y:a(y)}}function b(A){var z=document.documentElement,y=document.body||{scrollLeft:0};return A.pageX||(A.clientX+(z.scrollLeft||y.scrollLeft)-(z.clientLeft||0))}function a(A){var z=document.documentElement,y=document.body||{scrollTop:0};return A.pageY||(A.clientY+(z.scrollTop||y.scrollTop)-(z.clientTop||0))}function o(y){w.extend(y);y.preventDefault();y.stopPropagation();y.stopped=true}w.Methods={isLeftClick:s,isMiddleClick:r,isRightClick:l,element:c,findElement:n,pointer:q,pointerX:b,pointerY:a,stop:o};var u=Object.keys(w.Methods).inject({},function(y,z){y[z]=w.Methods[z].methodize();return y});if(Prototype.Browser.IE){function g(z){var y;switch(z.type){case"mouseover":y=z.fromElement;break;case"mouseout":y=z.toElement;break;default:return null}return Element.extend(y)}Object.extend(u,{stopPropagation:function(){this.cancelBubble=true},preventDefault:function(){this.returnValue=false},inspect:function(){return"[object Event]"}});w.extend=function(z,y){if(!z){return false}if(z._extendedByPrototype){return z}z._extendedByPrototype=Prototype.emptyFunction;var A=w.pointer(z);Object.extend(z,{target:z.srcElement||y,relatedTarget:g(z),pageX:A.x,pageY:A.y});return Object.extend(z,u)}}else{w.prototype=window.Event.prototype||document.createEvent("HTMLEvents").__proto__;Object.extend(w.prototype,u);w.extend=Prototype.K}function m(C,B,D){var A=Element.retrieve(C,"prototype_event_registry");if(Object.isUndefined(A)){d.push(C);A=Element.retrieve(C,"prototype_event_registry",$H())}var y=A.get(B);if(Object.isUndefined(y)){y=[];A.set(B,y)}if(y.pluck("handler").include(D)){return false}var z;if(B.include(":")){z=function(E){if(Object.isUndefined(E.eventName)){return false}if(E.eventName!==B){return false}w.extend(E,C);D.call(C,E)}}else{if(!x&&(B==="mouseenter"||B==="mouseleave")){if(B==="mouseenter"||B==="mouseleave"){z=function(F){w.extend(F,C);var E=F.relatedTarget;while(E&&E!==C){try{E=E.parentNode}catch(G){E=C}}if(E===C){return}D.call(C,F)}}}else{z=function(E){w.extend(E,C);D.call(C,E)}}}z.handler=D;y.push(z);return z}function f(){for(var y=0,z=d.length;y<z;y++){w.stopObserving(d[y]);d[y]=null}}var d=[];if(Prototype.Browser.IE){window.attachEvent("onunload",f)}if(Prototype.Browser.WebKit){window.addEventListener("unload",Prototype.emptyFunction,false)}var k=Prototype.K;if(!x){k=function(z){var y={mouseenter:"mouseover",mouseleave:"mouseout"};return z in y?y[z]:z}}function t(B,A,C){B=$(B);var z=m(B,A,C);if(!z){return B}if(A.include(":")){if(B.addEventListener){B.addEventListener("dataavailable",z,false)}else{B.attachEvent("ondataavailable",z);B.attachEvent("onfilterchange",z)}}else{var y=k(A);if(B.addEventListener){B.addEventListener(y,z,false)}else{B.attachEvent("on"+y,z)}}return B}function j(D,B,E){D=$(D);var A=Element.retrieve(D,"prototype_event_registry");if(Object.isUndefined(A)){return D}if(B&&!E){var C=A.get(B);if(Object.isUndefined(C)){return D}C.each(function(F){Element.stopObserving(D,B,F.handler)});return D}else{if(!B){A.each(function(H){var F=H.key,G=H.value;G.each(function(I){Element.stopObserving(D,F,I.handler)})});return D}}var C=A.get(B);if(!C){return}var z=C.find(function(F){return F.handler===E});if(!z){return D}var y=k(B);if(B.include(":")){if(D.removeEventListener){D.removeEventListener("dataavailable",z,false)}else{D.detachEvent("ondataavailable",z);D.detachEvent("onfilterchange",z)}}else{if(D.removeEventListener){D.removeEventListener(y,z,false)}else{D.detachEvent("on"+y,z)}}A.set(B,C.without(z));return D}function v(B,A,z,y){B=$(B);if(Object.isUndefined(y)){y=true}if(B==document&&document.createEvent&&!B.dispatchEvent){B=document.documentElement}var C;if(document.createEvent){C=document.createEvent("HTMLEvents");C.initEvent("dataavailable",true,true)}else{C=document.createEventObject();C.eventType=y?"ondataavailable":"onfilterchange"}C.eventName=A;C.memo=z||{};if(document.createEvent){B.dispatchEvent(C)}else{B.fireEvent(C.eventType,C)}return w.extend(C)}Object.extend(w,w.Methods);Object.extend(w,{fire:v,observe:t,stopObserving:j});Element.addMethods({fire:v,observe:t,stopObserving:j});Object.extend(document,{fire:v.methodize(),observe:t.methodize(),stopObserving:j.methodize(),loaded:false});if(window.Event){Object.extend(window.Event,w)}else{window.Event=w}})();(function(){var d;function a(){if(document.loaded){return}if(d){window.clearTimeout(d)}document.loaded=true;document.fire("dom:loaded")}function c(){if(document.readyState==="complete"){document.stopObserving("readystatechange",c);a()}}function b(){try{document.documentElement.doScroll("left")}catch(f){d=b.defer();return}a()}if(document.addEventListener){document.addEventListener("DOMContentLoaded",a,false)}else{document.observe("readystatechange",c);if(window==top){d=b.defer()}}Event.observe(window,"load",a)})();Element.addMethods();Hash.toQueryString=Object.toQueryString;var Toggle={display:Element.toggle};Element.Methods.childOf=Element.Methods.descendantOf;var Insertion={Before:function(a,b){return Element.insert(a,{before:b})},Top:function(a,b){return Element.insert(a,{top:b})},Bottom:function(a,b){return Element.insert(a,{bottom:b})},After:function(a,b){return Element.insert(a,{after:b})}};var $continue=new Error('"throw $continue" is deprecated, use "return" instead');var Position={includeScrollOffsets:false,prepare:function(){this.deltaX=window.pageXOffset||document.documentElement.scrollLeft||document.body.scrollLeft||0;this.deltaY=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0},within:function(b,a,c){if(this.includeScrollOffsets){return this.withinIncludingScrolloffsets(b,a,c)}this.xcomp=a;this.ycomp=c;this.offset=Element.cumulativeOffset(b);return(c>=this.offset[1]&&c<this.offset[1]+b.offsetHeight&&a>=this.offset[0]&&a<this.offset[0]+b.offsetWidth)},withinIncludingScrolloffsets:function(b,a,d){var c=Element.cumulativeScrollOffset(b);this.xcomp=a+c[0]-this.deltaX;this.ycomp=d+c[1]-this.deltaY;this.offset=Element.cumulativeOffset(b);return(this.ycomp>=this.offset[1]&&this.ycomp<this.offset[1]+b.offsetHeight&&this.xcomp>=this.offset[0]&&this.xcomp<this.offset[0]+b.offsetWidth)},overlap:function(b,a){if(!b){return 0}if(b=="vertical"){return((this.offset[1]+a.offsetHeight)-this.ycomp)/a.offsetHeight}if(b=="horizontal"){return((this.offset[0]+a.offsetWidth)-this.xcomp)/a.offsetWidth}},cumulativeOffset:Element.Methods.cumulativeOffset,positionedOffset:Element.Methods.positionedOffset,absolutize:function(a){Position.prepare();return Element.absolutize(a)},relativize:function(a){Position.prepare();return Element.relativize(a)},realOffset:Element.Methods.cumulativeScrollOffset,offsetParent:Element.Methods.getOffsetParent,page:Element.Methods.viewportOffset,clone:function(b,c,a){a=a||{};return Element.clonePosition(c,b,a)}};if(!document.getElementsByClassName){document.getElementsByClassName=function(b){function a(c){return c.blank()?null:"[contains(concat(' ', @class, ' '), ' "+c+" ')]"}b.getElementsByClassName=Prototype.BrowserFeatures.XPath?function(c,e){e=e.toString().strip();var d=/\s/.test(e)?$w(e).map(a).join(""):a(e);return d?document._getElementsByXPath(".//*"+d,c):[]}:function(e,f){f=f.toString().strip();var g=[],h=(/\s/.test(f)?$w(f):null);if(!h&&!f){return g}var c=$(e).getElementsByTagName("*");f=" "+f+" ";for(var d=0,k,j;k=c[d];d++){if(k.className&&(j=" "+k.className+" ")&&(j.include(f)||(h&&h.all(function(l){return !l.toString().blank()&&j.include(" "+l+" ")})))){g.push(Element.extend(k))}}return g};return function(d,c){return $(c||document.body).getElementsByClassName(d)}}(Element.Methods)}Element.ClassNames=Class.create();Element.ClassNames.prototype={initialize:function(a){this.element=$(a)},_each:function(a){this.element.className.split(/\s+/).select(function(b){return b.length>0})._each(a)},set:function(a){this.element.className=a},add:function(a){if(this.include(a)){return}this.set($A(this).concat(a).join(" "))},remove:function(a){if(!this.include(a)){return}this.set($A(this).without(a).join(" "))},toString:function(){return $A(this).join(" ")}};Object.extend(Element.ClassNames.prototype,Enumerable);var Scriptaculous={Version:"1.8.3",REQUIRED_PROTOTYPE:"1.6.0.3",load:function(){function a(b){var c=b.replace(/_.*|\./g,"");c=parseInt(c+"0".times(4-c.length));return b.indexOf("_")>-1?c-1:c}if((typeof Prototype=="undefined")||(typeof Element=="undefined")||(typeof Element.Methods=="undefined")||(a(Prototype.Version)<a(Scriptaculous.REQUIRED_PROTOTYPE))){throw ("script.aculo.us requires the Prototype JavaScript framework >= "+Scriptaculous.REQUIRED_PROTOTYPE)}}};Scriptaculous.load();var Builder={NODEMAP:{AREA:"map",CAPTION:"table",COL:"table",COLGROUP:"table",LEGEND:"fieldset",OPTGROUP:"select",OPTION:"select",PARAM:"object",TBODY:"table",TD:"table",TFOOT:"table",TH:"table",THEAD:"table",TR:"table"},node:function(a){a=a.toUpperCase();var g=this.NODEMAP[a]||"div";var b=document.createElement(g);try{b.innerHTML="<"+a+"></"+a+">"}catch(f){}var d=b.firstChild||null;if(d&&(d.tagName.toUpperCase()!=a)){d=d.getElementsByTagName(a)[0]}if(!d){d=document.createElement(a)}if(!d){return}if(arguments[1]){if(this._isStringOrNumber(arguments[1])||(arguments[1] instanceof Array)||arguments[1].tagName){this._children(d,arguments[1])}else{var c=this._attributes(arguments[1]);if(c.length){try{b.innerHTML="<"+a+" "+c+"></"+a+">"}catch(f){}d=b.firstChild||null;if(!d){d=document.createElement(a);for(attr in arguments[1]){d[attr=="class"?"className":attr]=arguments[1][attr]}}if(d.tagName.toUpperCase()!=a){d=b.getElementsByTagName(a)[0]}}}}if(arguments[2]){this._children(d,arguments[2])}return $(d)},_text:function(a){return document.createTextNode(a)},ATTR_MAP:{className:"class",htmlFor:"for"},_attributes:function(a){var b=[];for(attribute in a){b.push((attribute in this.ATTR_MAP?this.ATTR_MAP[attribute]:attribute)+'="'+a[attribute].toString().escapeHTML().gsub(/"/,"&quot;")+'"')}return b.join(" ")},_children:function(b,a){if(a.tagName){b.appendChild(a);return}if(typeof a=="object"){a.flatten().each(function(c){if(typeof c=="object"){b.appendChild(c)}else{if(Builder._isStringOrNumber(c)){b.appendChild(Builder._text(c))}}})}else{if(Builder._isStringOrNumber(a)){b.appendChild(Builder._text(a))}}},_isStringOrNumber:function(a){return(typeof a=="string"||typeof a=="number")},build:function(b){var a=this.node("div");$(a).update(b.strip());return a.down()},dump:function(b){if(typeof b!="object"&&typeof b!="function"){b=window}var a=("A ABBR ACRONYM ADDRESS APPLET AREA B BASE BASEFONT BDO BIG BLOCKQUOTE BODY BR BUTTON CAPTION CENTER CITE CODE COL COLGROUP DD DEL DFN DIR DIV DL DT EM FIELDSET FONT FORM FRAME FRAMESET H1 H2 H3 H4 H5 H6 HEAD HR HTML I IFRAME IMG INPUT INS ISINDEX KBD LABEL LEGEND LI LINK MAP MENU META NOFRAMES NOSCRIPT OBJECT OL OPTGROUP OPTION P PARAM PRE Q S SAMP SCRIPT SELECT SMALL SPAN STRIKE STRONG STYLE SUB SUP TABLE TBODY TD TEXTAREA TFOOT TH THEAD TITLE TR TT U UL VAR").split(/\s+/);a.each(function(c){b[c]=function(){return Builder.node.apply(Builder,[c].concat($A(arguments)))}})}};String.prototype.parseColor=function(){var a="#";if(this.slice(0,4)=="rgb("){var c=this.slice(4,this.length-1).split(",");var b=0;do{a+=parseInt(c[b]).toColorPart()}while(++b<3)}else{if(this.slice(0,1)=="#"){if(this.length==4){for(var b=1;b<4;b++){a+=(this.charAt(b)+this.charAt(b)).toLowerCase()}}if(this.length==7){a=this.toLowerCase()}}}return(a.length==7?a:(arguments[0]||this))};Element.collectTextNodes=function(a){return $A($(a).childNodes).collect(function(b){return(b.nodeType==3?b.nodeValue:(b.hasChildNodes()?Element.collectTextNodes(b):""))}).flatten().join("")};Element.collectTextNodesIgnoreClass=function(a,b){return $A($(a).childNodes).collect(function(c){return(c.nodeType==3?c.nodeValue:((c.hasChildNodes()&&!Element.hasClassName(c,b))?Element.collectTextNodesIgnoreClass(c,b):""))}).flatten().join("")};Element.setContentZoom=function(a,b){a=$(a);a.setStyle({fontSize:(b/100)+"em"});if(Prototype.Browser.WebKit){window.scrollBy(0,0)}return a};Element.getInlineOpacity=function(a){return $(a).style.opacity||""};Element.forceRerendering=function(a){try{a=$(a);var c=document.createTextNode(" ");a.appendChild(c);a.removeChild(c)}catch(b){}};var Effect={_elementDoesNotExistError:{name:"ElementDoesNotExistError",message:"The specified DOM element does not exist, but is required for this effect to operate"},Transitions:{linear:Prototype.K,sinoidal:function(a){return(-Math.cos(a*Math.PI)/2)+0.5},reverse:function(a){return 1-a},flicker:function(a){var a=((-Math.cos(a*Math.PI)/4)+0.75)+Math.random()/4;return a>1?1:a},wobble:function(a){return(-Math.cos(a*Math.PI*(9*a))/2)+0.5},pulse:function(b,a){return(-Math.cos((b*((a||5)-0.5)*2)*Math.PI)/2)+0.5},spring:function(a){return 1-(Math.cos(a*4.5*Math.PI)*Math.exp(-a*6))},none:function(a){return 0},full:function(a){return 1}},DefaultOptions:{duration:1,fps:100,sync:false,from:0,to:1,delay:0,queue:"parallel"},tagifyText:function(a){var b="position:relative";if(Prototype.Browser.IE){b+=";zoom:1"}a=$(a);$A(a.childNodes).each(function(c){if(c.nodeType==3){c.nodeValue.toArray().each(function(d){a.insertBefore(new Element("span",{style:b}).update(d==" "?String.fromCharCode(160):d),c)});Element.remove(c)}})},multiple:function(b,c){var e;if(((typeof b=="object")||Object.isFunction(b))&&(b.length)){e=b}else{e=$(b).childNodes}var a=Object.extend({speed:0.1,delay:0},arguments[2]||{});var d=a.delay;$A(e).each(function(g,f){new c(g,Object.extend(a,{delay:f*a.speed+d}))})},PAIRS:{slide:["SlideDown","SlideUp"],blind:["BlindDown","BlindUp"],appear:["Appear","Fade"]},toggle:function(b,c,a){b=$(b);c=(c||"appear").toLowerCase();return Effect[Effect.PAIRS[c][b.visible()?1:0]](b,Object.extend({queue:{position:"end",scope:(b.id||"global"),limit:1}},a||{}))}};Effect.DefaultOptions.transition=Effect.Transitions.sinoidal;Effect.ScopedQueue=Class.create(Enumerable,{initialize:function(){this.effects=[];this.interval=null},_each:function(a){this.effects._each(a)},add:function(b){var c=new Date().getTime();var a=Object.isString(b.options.queue)?b.options.queue:b.options.queue.position;switch(a){case"front":this.effects.findAll(function(d){return d.state=="idle"}).each(function(d){d.startOn+=b.finishOn;d.finishOn+=b.finishOn});break;case"with-last":c=this.effects.pluck("startOn").max()||c;break;case"end":c=this.effects.pluck("finishOn").max()||c;break}b.startOn+=c;b.finishOn+=c;if(!b.options.queue.limit||(this.effects.length<b.options.queue.limit)){this.effects.push(b)}if(!this.interval){this.interval=setInterval(this.loop.bind(this),15)}},remove:function(a){this.effects=this.effects.reject(function(b){return b==a});if(this.effects.length==0){clearInterval(this.interval);this.interval=null}},loop:function(){var c=new Date().getTime();for(var b=0,a=this.effects.length;b<a;b++){this.effects[b]&&this.effects[b].loop(c)}}});Effect.Queues={instances:$H(),get:function(a){if(!Object.isString(a)){return a}return this.instances.get(a)||this.instances.set(a,new Effect.ScopedQueue())}};Effect.Queue=Effect.Queues.get("global");Effect.Base=Class.create({position:null,start:function(a){if(a&&a.transition===false){a.transition=Effect.Transitions.linear}this.options=Object.extend(Object.extend({},Effect.DefaultOptions),a||{});this.currentFrame=0;this.state="idle";this.startOn=this.options.delay*1000;this.finishOn=this.startOn+(this.options.duration*1000);this.fromToDelta=this.options.to-this.options.from;this.totalTime=this.finishOn-this.startOn;this.totalFrames=this.options.fps*this.options.duration;this.render=(function(){function b(d,c){if(d.options[c+"Internal"]){d.options[c+"Internal"](d)}if(d.options[c]){d.options[c](d)}}return function(c){if(this.state==="idle"){this.state="running";b(this,"beforeSetup");if(this.setup){this.setup()}b(this,"afterSetup")}if(this.state==="running"){c=(this.options.transition(c)*this.fromToDelta)+this.options.from;this.position=c;b(this,"beforeUpdate");if(this.update){this.update(c)}b(this,"afterUpdate")}}})();this.event("beforeStart");if(!this.options.sync){Effect.Queues.get(Object.isString(this.options.queue)?"global":this.options.queue.scope).add(this)}},loop:function(c){if(c>=this.startOn){if(c>=this.finishOn){this.render(1);this.cancel();this.event("beforeFinish");if(this.finish){this.finish()}this.event("afterFinish");return}var b=(c-this.startOn)/this.totalTime,a=(b*this.totalFrames).round();if(a>this.currentFrame){this.render(b);this.currentFrame=a}}},cancel:function(){if(!this.options.sync){Effect.Queues.get(Object.isString(this.options.queue)?"global":this.options.queue.scope).remove(this)}this.state="finished"},event:function(a){if(this.options[a+"Internal"]){this.options[a+"Internal"](this)}if(this.options[a]){this.options[a](this)}},inspect:function(){var a=$H();for(property in this){if(!Object.isFunction(this[property])){a.set(property,this[property])}}return"#<Effect:"+a.inspect()+",options:"+$H(this.options).inspect()+">"}});Effect.Parallel=Class.create(Effect.Base,{initialize:function(a){this.effects=a||[];this.start(arguments[1])},update:function(a){this.effects.invoke("render",a)},finish:function(a){this.effects.each(function(b){b.render(1);b.cancel();b.event("beforeFinish");if(b.finish){b.finish(a)}b.event("afterFinish")})}});Effect.Tween=Class.create(Effect.Base,{initialize:function(c,f,e){c=Object.isString(c)?$(c):c;var b=$A(arguments),d=b.last(),a=b.length==5?b[3]:null;this.method=Object.isFunction(d)?d.bind(c):Object.isFunction(c[d])?c[d].bind(c):function(g){c[d]=g};this.start(Object.extend({from:f,to:e},a||{}))},update:function(a){this.method(a)}});Effect.Event=Class.create(Effect.Base,{initialize:function(){this.start(Object.extend({duration:0},arguments[0]||{}))},update:Prototype.emptyFunction});Effect.Opacity=Class.create(Effect.Base,{initialize:function(b){this.element=$(b);if(!this.element){throw (Effect._elementDoesNotExistError)}if(Prototype.Browser.IE&&(!this.element.currentStyle.hasLayout)){this.element.setStyle({zoom:1})}var a=Object.extend({from:this.element.getOpacity()||0,to:1},arguments[1]||{});this.start(a)},update:function(a){this.element.setOpacity(a)}});Effect.Move=Class.create(Effect.Base,{initialize:function(b){this.element=$(b);if(!this.element){throw (Effect._elementDoesNotExistError)}var a=Object.extend({x:0,y:0,mode:"relative"},arguments[1]||{});this.start(a)},setup:function(){this.element.makePositioned();this.originalLeft=parseFloat(this.element.getStyle("left")||"0");this.originalTop=parseFloat(this.element.getStyle("top")||"0");if(this.options.mode=="absolute"){this.options.x=this.options.x-this.originalLeft;this.options.y=this.options.y-this.originalTop}},update:function(a){this.element.setStyle({left:(this.options.x*a+this.originalLeft).round()+"px",top:(this.options.y*a+this.originalTop).round()+"px"})}});Effect.MoveBy=function(b,a,c){return new Effect.Move(b,Object.extend({x:c,y:a},arguments[3]||{}))};Effect.Scale=Class.create(Effect.Base,{initialize:function(b,c){this.element=$(b);if(!this.element){throw (Effect._elementDoesNotExistError)}var a=Object.extend({scaleX:true,scaleY:true,scaleContent:true,scaleFromCenter:false,scaleMode:"box",scaleFrom:100,scaleTo:c},arguments[2]||{});this.start(a)},setup:function(){this.restoreAfterFinish=this.options.restoreAfterFinish||false;this.elementPositioning=this.element.getStyle("position");this.originalStyle={};["top","left","width","height","fontSize"].each(function(b){this.originalStyle[b]=this.element.style[b]}.bind(this));this.originalTop=this.element.offsetTop;this.originalLeft=this.element.offsetLeft;var a=this.element.getStyle("font-size")||"100%";["em","px","%","pt"].each(function(b){if(a.indexOf(b)>0){this.fontSize=parseFloat(a);this.fontSizeType=b}}.bind(this));this.factor=(this.options.scaleTo-this.options.scaleFrom)/100;this.dims=null;if(this.options.scaleMode=="box"){this.dims=[this.element.offsetHeight,this.element.offsetWidth]}if(/^content/.test(this.options.scaleMode)){this.dims=[this.element.scrollHeight,this.element.scrollWidth]}if(!this.dims){this.dims=[this.options.scaleMode.originalHeight,this.options.scaleMode.originalWidth]}},update:function(a){var b=(this.options.scaleFrom/100)+(this.factor*a);if(this.options.scaleContent&&this.fontSize){this.element.setStyle({fontSize:this.fontSize*b+this.fontSizeType})}this.setDimensions(this.dims[0]*b,this.dims[1]*b)},finish:function(a){if(this.restoreAfterFinish){this.element.setStyle(this.originalStyle)}},setDimensions:function(a,e){var f={};if(this.options.scaleX){f.width=e.round()+"px"}if(this.options.scaleY){f.height=a.round()+"px"}if(this.options.scaleFromCenter){var c=(a-this.dims[0])/2;var b=(e-this.dims[1])/2;if(this.elementPositioning=="absolute"){if(this.options.scaleY){f.top=this.originalTop-c+"px"}if(this.options.scaleX){f.left=this.originalLeft-b+"px"}}else{if(this.options.scaleY){f.top=-c+"px"}if(this.options.scaleX){f.left=-b+"px"}}}this.element.setStyle(f)}});Effect.Highlight=Class.create(Effect.Base,{initialize:function(b){this.element=$(b);if(!this.element){throw (Effect._elementDoesNotExistError)}var a=Object.extend({startcolor:"#ffff99"},arguments[1]||{});this.start(a)},setup:function(){if(this.element.getStyle("display")=="none"){this.cancel();return}this.oldStyle={};if(!this.options.keepBackgroundImage){this.oldStyle.backgroundImage=this.element.getStyle("background-image");this.element.setStyle({backgroundImage:"none"})}if(!this.options.endcolor){this.options.endcolor=this.element.getStyle("background-color").parseColor("#ffffff")}if(!this.options.restorecolor){this.options.restorecolor=this.element.getStyle("background-color")}this._base=$R(0,2).map(function(a){return parseInt(this.options.startcolor.slice(a*2+1,a*2+3),16)}.bind(this));this._delta=$R(0,2).map(function(a){return parseInt(this.options.endcolor.slice(a*2+1,a*2+3),16)-this._base[a]}.bind(this))},update:function(a){this.element.setStyle({backgroundColor:$R(0,2).inject("#",function(b,c,d){return b+((this._base[d]+(this._delta[d]*a)).round().toColorPart())}.bind(this))})},finish:function(){this.element.setStyle(Object.extend(this.oldStyle,{backgroundColor:this.options.restorecolor}))}});Effect.ScrollTo=function(c){var b=arguments[1]||{},a=document.viewport.getScrollOffsets(),d=$(c).cumulativeOffset();if(b.offset){d[1]+=b.offset}return new Effect.Tween(null,a.top,d[1],b,function(e){scrollTo(a.left,e.round())})};Effect.Fade=function(c){c=$(c);var a=c.getInlineOpacity();var b=Object.extend({from:c.getOpacity()||1,to:0,afterFinishInternal:function(d){if(d.options.to!=0){return}d.element.hide().setStyle({opacity:a})}},arguments[1]||{});return new Effect.Opacity(c,b)};Effect.Appear=function(b){b=$(b);var a=Object.extend({from:(b.getStyle("display")=="none"?0:b.getOpacity()||0),to:1,afterFinishInternal:function(c){c.element.forceRerendering()},beforeSetup:function(c){c.element.setOpacity(c.options.from).show()}},arguments[1]||{});return new Effect.Opacity(b,a)};Effect.Puff=function(b){b=$(b);var a={opacity:b.getInlineOpacity(),position:b.getStyle("position"),top:b.style.top,left:b.style.left,width:b.style.width,height:b.style.height};return new Effect.Parallel([new Effect.Scale(b,200,{sync:true,scaleFromCenter:true,scaleContent:true,restoreAfterFinish:true}),new Effect.Opacity(b,{sync:true,to:0})],Object.extend({duration:1,beforeSetupInternal:function(c){Position.absolutize(c.effects[0].element)},afterFinishInternal:function(c){c.effects[0].element.hide().setStyle(a)}},arguments[1]||{}))};Effect.BlindUp=function(a){a=$(a);a.makeClipping();return new Effect.Scale(a,0,Object.extend({scaleContent:false,scaleX:false,restoreAfterFinish:true,afterFinishInternal:function(b){b.element.hide().undoClipping()}},arguments[1]||{}))};Effect.BlindDown=function(b){b=$(b);var a=b.getDimensions();return new Effect.Scale(b,100,Object.extend({scaleContent:false,scaleX:false,scaleFrom:0,scaleMode:{originalHeight:a.height,originalWidth:a.width},restoreAfterFinish:true,afterSetup:function(c){c.element.makeClipping().setStyle({height:"0px"}).show()},afterFinishInternal:function(c){c.element.undoClipping()}},arguments[1]||{}))};Effect.SwitchOff=function(b){b=$(b);var a=b.getInlineOpacity();return new Effect.Appear(b,Object.extend({duration:0.4,from:0,transition:Effect.Transitions.flicker,afterFinishInternal:function(c){new Effect.Scale(c.element,1,{duration:0.3,scaleFromCenter:true,scaleX:false,scaleContent:false,restoreAfterFinish:true,beforeSetup:function(d){d.element.makePositioned().makeClipping()},afterFinishInternal:function(d){d.element.hide().undoClipping().undoPositioned().setStyle({opacity:a})}})}},arguments[1]||{}))};Effect.DropOut=function(b){b=$(b);var a={top:b.getStyle("top"),left:b.getStyle("left"),opacity:b.getInlineOpacity()};return new Effect.Parallel([new Effect.Move(b,{x:0,y:100,sync:true}),new Effect.Opacity(b,{sync:true,to:0})],Object.extend({duration:0.5,beforeSetup:function(c){c.effects[0].element.makePositioned()},afterFinishInternal:function(c){c.effects[0].element.hide().undoPositioned().setStyle(a)}},arguments[1]||{}))};Effect.Shake=function(d){d=$(d);var b=Object.extend({distance:20,duration:0.5},arguments[1]||{});var e=parseFloat(b.distance);var c=parseFloat(b.duration)/10;var a={top:d.getStyle("top"),left:d.getStyle("left")};return new Effect.Move(d,{x:e,y:0,duration:c,afterFinishInternal:function(f){new Effect.Move(f.element,{x:-e*2,y:0,duration:c*2,afterFinishInternal:function(g){new Effect.Move(g.element,{x:e*2,y:0,duration:c*2,afterFinishInternal:function(h){new Effect.Move(h.element,{x:-e*2,y:0,duration:c*2,afterFinishInternal:function(j){new Effect.Move(j.element,{x:e*2,y:0,duration:c*2,afterFinishInternal:function(k){new Effect.Move(k.element,{x:-e,y:0,duration:c,afterFinishInternal:function(l){l.element.undoPositioned().setStyle(a)}})}})}})}})}})}})};Effect.SlideDown=function(c){c=$(c).cleanWhitespace();var a=c.down().getStyle("bottom");var b=c.getDimensions();return new Effect.Scale(c,100,Object.extend({scaleContent:false,scaleX:false,scaleFrom:window.opera?0:1,scaleMode:{originalHeight:b.height,originalWidth:b.width},restoreAfterFinish:true,afterSetup:function(d){d.element.makePositioned();d.element.down().makePositioned();if(window.opera){d.element.setStyle({top:""})}d.element.makeClipping().setStyle({height:"0px"}).show()},afterUpdateInternal:function(d){d.element.down().setStyle({bottom:(d.dims[0]-d.element.clientHeight)+"px"})},afterFinishInternal:function(d){d.element.undoClipping().undoPositioned();d.element.down().undoPositioned().setStyle({bottom:a})}},arguments[1]||{}))};Effect.SlideUp=function(c){c=$(c).cleanWhitespace();var a=c.down().getStyle("bottom");var b=c.getDimensions();return new Effect.Scale(c,window.opera?0:1,Object.extend({scaleContent:false,scaleX:false,scaleMode:"box",scaleFrom:100,scaleMode:{originalHeight:b.height,originalWidth:b.width},restoreAfterFinish:true,afterSetup:function(d){d.element.makePositioned();d.element.down().makePositioned();if(window.opera){d.element.setStyle({top:""})}d.element.makeClipping().show()},afterUpdateInternal:function(d){d.element.down().setStyle({bottom:(d.dims[0]-d.element.clientHeight)+"px"})},afterFinishInternal:function(d){d.element.hide().undoClipping().undoPositioned();d.element.down().undoPositioned().setStyle({bottom:a})}},arguments[1]||{}))};Effect.Squish=function(a){return new Effect.Scale(a,window.opera?1:0,{restoreAfterFinish:true,beforeSetup:function(b){b.element.makeClipping()},afterFinishInternal:function(b){b.element.hide().undoClipping()}})};Effect.Grow=function(c){c=$(c);var b=Object.extend({direction:"center",moveTransition:Effect.Transitions.sinoidal,scaleTransition:Effect.Transitions.sinoidal,opacityTransition:Effect.Transitions.full},arguments[1]||{});var a={top:c.style.top,left:c.style.left,height:c.style.height,width:c.style.width,opacity:c.getInlineOpacity()};var g=c.getDimensions();var h,f;var e,d;switch(b.direction){case"top-left":h=f=e=d=0;break;case"top-right":h=g.width;f=d=0;e=-g.width;break;case"bottom-left":h=e=0;f=g.height;d=-g.height;break;case"bottom-right":h=g.width;f=g.height;e=-g.width;d=-g.height;break;case"center":h=g.width/2;f=g.height/2;e=-g.width/2;d=-g.height/2;break}return new Effect.Move(c,{x:h,y:f,duration:0.01,beforeSetup:function(j){j.element.hide().makeClipping().makePositioned()},afterFinishInternal:function(j){new Effect.Parallel([new Effect.Opacity(j.element,{sync:true,to:1,from:0,transition:b.opacityTransition}),new Effect.Move(j.element,{x:e,y:d,sync:true,transition:b.moveTransition}),new Effect.Scale(j.element,100,{scaleMode:{originalHeight:g.height,originalWidth:g.width},sync:true,scaleFrom:window.opera?1:0,transition:b.scaleTransition,restoreAfterFinish:true})],Object.extend({beforeSetup:function(k){k.effects[0].element.setStyle({height:"0px"}).show()},afterFinishInternal:function(k){k.effects[0].element.undoClipping().undoPositioned().setStyle(a)}},b))}})};Effect.Shrink=function(c){c=$(c);var b=Object.extend({direction:"center",moveTransition:Effect.Transitions.sinoidal,scaleTransition:Effect.Transitions.sinoidal,opacityTransition:Effect.Transitions.none},arguments[1]||{});var a={top:c.style.top,left:c.style.left,height:c.style.height,width:c.style.width,opacity:c.getInlineOpacity()};var f=c.getDimensions();var e,d;switch(b.direction){case"top-left":e=d=0;break;case"top-right":e=f.width;d=0;break;case"bottom-left":e=0;d=f.height;break;case"bottom-right":e=f.width;d=f.height;break;case"center":e=f.width/2;d=f.height/2;break}return new Effect.Parallel([new Effect.Opacity(c,{sync:true,to:0,from:1,transition:b.opacityTransition}),new Effect.Scale(c,window.opera?1:0,{sync:true,transition:b.scaleTransition,restoreAfterFinish:true}),new Effect.Move(c,{x:e,y:d,sync:true,transition:b.moveTransition})],Object.extend({beforeStartInternal:function(g){g.effects[0].element.makePositioned().makeClipping()},afterFinishInternal:function(g){g.effects[0].element.hide().undoClipping().undoPositioned().setStyle(a)}},b))};Effect.Pulsate=function(c){c=$(c);var b=arguments[1]||{},a=c.getInlineOpacity(),e=b.transition||Effect.Transitions.linear,d=function(f){return 1-e((-Math.cos((f*(b.pulses||5)*2)*Math.PI)/2)+0.5)};return new Effect.Opacity(c,Object.extend(Object.extend({duration:2,from:0,afterFinishInternal:function(f){f.element.setStyle({opacity:a})}},b),{transition:d}))};Effect.Fold=function(b){b=$(b);var a={top:b.style.top,left:b.style.left,width:b.style.width,height:b.style.height};b.makeClipping();return new Effect.Scale(b,5,Object.extend({scaleContent:false,scaleX:false,afterFinishInternal:function(c){new Effect.Scale(b,1,{scaleContent:false,scaleY:false,afterFinishInternal:function(d){d.element.hide().undoClipping().setStyle(a)}})}},arguments[1]||{}))};Effect.Morph=Class.create(Effect.Base,{initialize:function(c){this.element=$(c);if(!this.element){throw (Effect._elementDoesNotExistError)}var a=Object.extend({style:{}},arguments[1]||{});if(!Object.isString(a.style)){this.style=$H(a.style)}else{if(a.style.include(":")){this.style=a.style.parseStyle()}else{this.element.addClassName(a.style);this.style=$H(this.element.getStyles());this.element.removeClassName(a.style);var b=this.element.getStyles();this.style=this.style.reject(function(d){return d.value==b[d.key]});a.afterFinishInternal=function(d){d.element.addClassName(d.options.style);d.transforms.each(function(e){d.element.style[e.style]=""})}}}this.start(a)},setup:function(){function a(b){if(!b||["rgba(0, 0, 0, 0)","transparent"].include(b)){b="#ffffff"}b=b.parseColor();return $R(0,2).map(function(c){return parseInt(b.slice(c*2+1,c*2+3),16)})}this.transforms=this.style.map(function(g){var f=g[0],e=g[1],d=null;if(e.parseColor("#zzzzzz")!="#zzzzzz"){e=e.parseColor();d="color"}else{if(f=="opacity"){e=parseFloat(e);if(Prototype.Browser.IE&&(!this.element.currentStyle.hasLayout)){this.element.setStyle({zoom:1})}}else{if(Element.CSS_LENGTH.test(e)){var c=e.match(/^([\+\-]?[0-9\.]+)(.*)$/);e=parseFloat(c[1]);d=(c.length==3)?c[2]:null}}}var b=this.element.getStyle(f);return{style:f.camelize(),originalValue:d=="color"?a(b):parseFloat(b||0),targetValue:d=="color"?a(e):e,unit:d}}.bind(this)).reject(function(b){return((b.originalValue==b.targetValue)||(b.unit!="color"&&(isNaN(b.originalValue)||isNaN(b.targetValue))))})},update:function(a){var d={},b,c=this.transforms.length;while(c--){d[(b=this.transforms[c]).style]=b.unit=="color"?"#"+(Math.round(b.originalValue[0]+(b.targetValue[0]-b.originalValue[0])*a)).toColorPart()+(Math.round(b.originalValue[1]+(b.targetValue[1]-b.originalValue[1])*a)).toColorPart()+(Math.round(b.originalValue[2]+(b.targetValue[2]-b.originalValue[2])*a)).toColorPart():(b.originalValue+(b.targetValue-b.originalValue)*a).toFixed(3)+(b.unit===null?"":b.unit)}this.element.setStyle(d,true)}});Effect.Transform=Class.create({initialize:function(a){this.tracks=[];this.options=arguments[1]||{};this.addTracks(a)},addTracks:function(a){a.each(function(b){b=$H(b);var c=b.values().first();this.tracks.push($H({ids:b.keys().first(),effect:Effect.Morph,options:{style:c}}))}.bind(this));return this},play:function(){return new Effect.Parallel(this.tracks.map(function(a){var d=a.get("ids"),c=a.get("effect"),b=a.get("options");var e=[$(d)||$$(d)].flatten();return e.map(function(f){return new c(f,Object.extend({sync:true},b))})}).flatten(),this.options)}});Element.CSS_PROPERTIES=$w("backgroundColor backgroundPosition borderBottomColor borderBottomStyle borderBottomWidth borderLeftColor borderLeftStyle borderLeftWidth borderRightColor borderRightStyle borderRightWidth borderSpacing borderTopColor borderTopStyle borderTopWidth bottom clip color fontSize fontWeight height left letterSpacing lineHeight marginBottom marginLeft marginRight marginTop markerOffset maxHeight maxWidth minHeight minWidth opacity outlineColor outlineOffset outlineWidth paddingBottom paddingLeft paddingRight paddingTop right textIndent top width wordSpacing zIndex");Element.CSS_LENGTH=/^(([\+\-]?[0-9\.]+)(em|ex|px|in|cm|mm|pt|pc|%))|0$/;String.__parseStyleElement=document.createElement("div");String.prototype.parseStyle=function(){var b,a=$H();if(Prototype.Browser.WebKit){b=new Element("div",{style:this}).style}else{String.__parseStyleElement.innerHTML='<div style="'+this+'"></div>';b=String.__parseStyleElement.childNodes[0].style}Element.CSS_PROPERTIES.each(function(c){if(b[c]){a.set(c,b[c])}});if(Prototype.Browser.IE&&this.include("opacity")){a.set("opacity",this.match(/opacity:\s*((?:0|1)?(?:\.\d*)?)/)[1])}return a};if(document.defaultView&&document.defaultView.getComputedStyle){Element.getStyles=function(b){var a=document.defaultView.getComputedStyle($(b),null);return Element.CSS_PROPERTIES.inject({},function(c,d){c[d]=a[d];return c})}}else{Element.getStyles=function(b){b=$(b);var a=b.currentStyle,c;c=Element.CSS_PROPERTIES.inject({},function(d,e){d[e]=a[e];return d});if(!c.opacity){c.opacity=b.getOpacity()}return c}}Effect.Methods={morph:function(a,b){a=$(a);new Effect.Morph(a,Object.extend({style:b},arguments[2]||{}));return a},visualEffect:function(c,e,b){c=$(c);var d=e.dasherize().camelize(),a=d.charAt(0).toUpperCase()+d.substring(1);new Effect[a](c,b);return c},highlight:function(b,a){b=$(b);new Effect.Highlight(b,a);return b}};$w("fade appear grow shrink fold blindUp blindDown slideUp slideDown pulsate shake puff squish switchOff dropOut").each(function(a){Effect.Methods[a]=function(c,b){c=$(c);Effect[a.charAt(0).toUpperCase()+a.substring(1)](c,b);return c}});$w("getInlineOpacity forceRerendering setContentZoom collectTextNodes collectTextNodesIgnoreClass getStyles").each(function(a){Effect.Methods[a]=Element[a]});Element.addMethods(Effect.Methods);if(Object.isUndefined(Effect)){throw ("dragdrop.js requires including script.aculo.us' effects.js library")}var Droppables={drops:[],remove:function(a){this.drops=this.drops.reject(function(b){return b.element==$(a)})},add:function(b){b=$(b);var a=Object.extend({greedy:true,hoverclass:null,tree:false},arguments[1]||{});if(a.containment){a._containers=[];var c=a.containment;if(Object.isArray(c)){c.each(function(d){a._containers.push($(d))})}else{a._containers.push($(c))}}if(a.accept){a.accept=[a.accept].flatten()}Element.makePositioned(b);a.element=b;this.drops.push(a)},findDeepestChild:function(a){deepest=a[0];for(i=1;i<a.length;++i){if(Element.isParent(a[i].element,deepest.element)){deepest=a[i]}}return deepest},isContained:function(b,a){var c;if(a.tree){c=b.treeNode}else{c=b.parentNode}return a._containers.detect(function(d){return c==d})},isAffected:function(a,c,b){return((b.element!=c)&&((!b._containers)||this.isContained(c,b))&&((!b.accept)||(Element.classNames(c).detect(function(d){return b.accept.include(d)})))&&Position.within(b.element,a[0],a[1]))},deactivate:function(a){if(a.hoverclass){Element.removeClassName(a.element,a.hoverclass)}this.last_active=null},activate:function(a){if(a.hoverclass){Element.addClassName(a.element,a.hoverclass)}this.last_active=a},show:function(a,c){if(!this.drops.length){return}var b,d=[];this.drops.each(function(e){if(Droppables.isAffected(a,c,e)){d.push(e)}});if(d.length>0){b=Droppables.findDeepestChild(d)}if(this.last_active&&this.last_active!=b){this.deactivate(this.last_active)}if(b){Position.within(b.element,a[0],a[1]);if(b.onHover){b.onHover(c,b.element,Position.overlap(b.overlap,b.element))}if(b!=this.last_active){Droppables.activate(b)}}},fire:function(b,a){if(!this.last_active){return}Position.prepare();if(this.isAffected([Event.pointerX(b),Event.pointerY(b)],a,this.last_active)){if(this.last_active.onDrop){this.last_active.onDrop(a,this.last_active.element,b);return true}}},reset:function(){if(this.last_active){this.deactivate(this.last_active)}}};var Draggables={drags:[],observers:[],register:function(a){if(this.drags.length==0){this.eventMouseUp=this.endDrag.bindAsEventListener(this);this.eventMouseMove=this.updateDrag.bindAsEventListener(this);this.eventKeypress=this.keyPress.bindAsEventListener(this);Event.observe(document,"mouseup",this.eventMouseUp);Event.observe(document,"mousemove",this.eventMouseMove);Event.observe(document,"keypress",this.eventKeypress)}this.drags.push(a)},unregister:function(a){this.drags=this.drags.reject(function(b){return b==a});if(this.drags.length==0){Event.stopObserving(document,"mouseup",this.eventMouseUp);Event.stopObserving(document,"mousemove",this.eventMouseMove);Event.stopObserving(document,"keypress",this.eventKeypress)}},activate:function(a){if(a.options.delay){this._timeout=setTimeout(function(){Draggables._timeout=null;window.focus();Draggables.activeDraggable=a}.bind(this),a.options.delay)}else{window.focus();this.activeDraggable=a}},deactivate:function(){this.activeDraggable=null},updateDrag:function(a){if(!this.activeDraggable){return}var b=[Event.pointerX(a),Event.pointerY(a)];if(this._lastPointer&&(this._lastPointer.inspect()==b.inspect())){return}this._lastPointer=b;this.activeDraggable.updateDrag(a,b)},endDrag:function(a){if(this._timeout){clearTimeout(this._timeout);this._timeout=null}if(!this.activeDraggable){return}this._lastPointer=null;this.activeDraggable.endDrag(a);this.activeDraggable=null},keyPress:function(a){if(this.activeDraggable){this.activeDraggable.keyPress(a)}},addObserver:function(a){this.observers.push(a);this._cacheObserverCallbacks()},removeObserver:function(a){this.observers=this.observers.reject(function(b){return b.element==a});this._cacheObserverCallbacks()},notify:function(b,a,c){if(this[b+"Count"]>0){this.observers.each(function(d){if(d[b]){d[b](b,a,c)}})}if(a.options[b]){a.options[b](a,c)}},_cacheObserverCallbacks:function(){["onStart","onEnd","onDrag"].each(function(a){Draggables[a+"Count"]=Draggables.observers.select(function(b){return b[a]}).length})}};var Draggable=Class.create({initialize:function(b){var c={handle:false,reverteffect:function(f,e,d){var g=Math.sqrt(Math.abs(e^2)+Math.abs(d^2))*0.02;new Effect.Move(f,{x:-d,y:-e,duration:g,queue:{scope:"_draggable",position:"end"}})},endeffect:function(e){var d=Object.isNumber(e._opacity)?e._opacity:1;new Effect.Opacity(e,{duration:0.2,from:0.7,to:d,queue:{scope:"_draggable",position:"end"},afterFinish:function(){Draggable._dragging[e]=false}})},zindex:1000,revert:false,quiet:false,scroll:false,scrollSensitivity:20,scrollSpeed:15,snap:false,delay:0};if(!arguments[1]||Object.isUndefined(arguments[1].endeffect)){Object.extend(c,{starteffect:function(d){d._opacity=Element.getOpacity(d);Draggable._dragging[d]=true;new Effect.Opacity(d,{duration:0.2,from:d._opacity,to:0.7})}})}var a=Object.extend(c,arguments[1]||{});this.element=$(b);if(a.handle&&Object.isString(a.handle)){this.handle=this.element.down("."+a.handle,0)}if(!this.handle){this.handle=$(a.handle)}if(!this.handle){this.handle=this.element}if(a.scroll&&!a.scroll.scrollTo&&!a.scroll.outerHTML){a.scroll=$(a.scroll);this._isScrollChild=Element.childOf(this.element,a.scroll)}Element.makePositioned(this.element);this.options=a;this.dragging=false;this.eventMouseDown=this.initDrag.bindAsEventListener(this);Event.observe(this.handle,"mousedown",this.eventMouseDown);Draggables.register(this)},destroy:function(){Event.stopObserving(this.handle,"mousedown",this.eventMouseDown);Draggables.unregister(this)},currentDelta:function(){return([parseInt(Element.getStyle(this.element,"left")||"0"),parseInt(Element.getStyle(this.element,"top")||"0")])},initDrag:function(a){if(!Object.isUndefined(Draggable._dragging[this.element])&&Draggable._dragging[this.element]){return}if(Event.isLeftClick(a)){var c=Event.element(a);if((tag_name=c.tagName.toUpperCase())&&(tag_name=="INPUT"||tag_name=="SELECT"||tag_name=="OPTION"||tag_name=="BUTTON"||tag_name=="TEXTAREA")){return}var b=[Event.pointerX(a),Event.pointerY(a)];var d=this.element.cumulativeOffset();this.offset=[0,1].map(function(e){return(b[e]-d[e])});Draggables.activate(this);Event.stop(a)}},startDrag:function(b){this.dragging=true;if(!this.delta){this.delta=this.currentDelta()}if(this.options.zindex){this.originalZ=parseInt(Element.getStyle(this.element,"z-index")||0);this.element.style.zIndex=this.options.zindex}if(this.options.ghosting){this._clone=this.element.cloneNode(true);this._originallyAbsolute=(this.element.getStyle("position")=="absolute");if(!this._originallyAbsolute){Position.absolutize(this.element)}this.element.parentNode.insertBefore(this._clone,this.element)}if(this.options.scroll){if(this.options.scroll==window){var a=this._getWindowScroll(this.options.scroll);this.originalScrollLeft=a.left;this.originalScrollTop=a.top}else{this.originalScrollLeft=this.options.scroll.scrollLeft;this.originalScrollTop=this.options.scroll.scrollTop}}Draggables.notify("onStart",this,b);if(this.options.starteffect){this.options.starteffect(this.element)}},updateDrag:function(event,pointer){if(!this.dragging){this.startDrag(event)}if(!this.options.quiet){Position.prepare();Droppables.show(pointer,this.element)}Draggables.notify("onDrag",this,event);this.draw(pointer);if(this.options.change){this.options.change(this)}if(this.options.scroll){this.stopScrolling();var p;if(this.options.scroll==window){with(this._getWindowScroll(this.options.scroll)){p=[left,top,left+width,top+height]}}else{p=Position.page(this.options.scroll);p[0]+=this.options.scroll.scrollLeft+Position.deltaX;p[1]+=this.options.scroll.scrollTop+Position.deltaY;p.push(p[0]+this.options.scroll.offsetWidth);p.push(p[1]+this.options.scroll.offsetHeight)}var speed=[0,0];if(pointer[0]<(p[0]+this.options.scrollSensitivity)){speed[0]=pointer[0]-(p[0]+this.options.scrollSensitivity)}if(pointer[1]<(p[1]+this.options.scrollSensitivity)){speed[1]=pointer[1]-(p[1]+this.options.scrollSensitivity)}if(pointer[0]>(p[2]-this.options.scrollSensitivity)){speed[0]=pointer[0]-(p[2]-this.options.scrollSensitivity)}if(pointer[1]>(p[3]-this.options.scrollSensitivity)){speed[1]=pointer[1]-(p[3]-this.options.scrollSensitivity)}this.startScrolling(speed)}if(Prototype.Browser.WebKit){window.scrollBy(0,0)}Event.stop(event)},finishDrag:function(b,f){this.dragging=false;if(this.options.quiet){Position.prepare();var e=[Event.pointerX(b),Event.pointerY(b)];Droppables.show(e,this.element)}if(this.options.ghosting){if(!this._originallyAbsolute){Position.relativize(this.element)}delete this._originallyAbsolute;Element.remove(this._clone);this._clone=null}var g=false;if(f){g=Droppables.fire(b,this.element);if(!g){g=false}}if(g&&this.options.onDropped){this.options.onDropped(this.element)}Draggables.notify("onEnd",this,b);var a=this.options.revert;if(a&&Object.isFunction(a)){a=a(this.element)}var c=this.currentDelta();if(a&&this.options.reverteffect){if(g==0||a!="failure"){this.options.reverteffect(this.element,c[1]-this.delta[1],c[0]-this.delta[0])}}else{this.delta=c}if(this.options.zindex){this.element.style.zIndex=this.originalZ}if(this.options.endeffect){this.options.endeffect(this.element)}Draggables.deactivate(this);Droppables.reset()},keyPress:function(a){if(a.keyCode!=Event.KEY_ESC){return}this.finishDrag(a,false);Event.stop(a)},endDrag:function(a){if(!this.dragging){return}this.stopScrolling();this.finishDrag(a,true);Event.stop(a)},draw:function(a){var g=this.element.cumulativeOffset();if(this.options.ghosting){var c=Position.realOffset(this.element);g[0]+=c[0]-Position.deltaX;g[1]+=c[1]-Position.deltaY}var f=this.currentDelta();g[0]-=f[0];g[1]-=f[1];if(this.options.scroll&&(this.options.scroll!=window&&this._isScrollChild)){g[0]-=this.options.scroll.scrollLeft-this.originalScrollLeft;g[1]-=this.options.scroll.scrollTop-this.originalScrollTop}var e=[0,1].map(function(d){return(a[d]-g[d]-this.offset[d])}.bind(this));if(this.options.snap){if(Object.isFunction(this.options.snap)){e=this.options.snap(e[0],e[1],this)}else{if(Object.isArray(this.options.snap)){e=e.map(function(d,h){return(d/this.options.snap[h]).round()*this.options.snap[h]}.bind(this))}else{e=e.map(function(d){return(d/this.options.snap).round()*this.options.snap}.bind(this))}}}var b=this.element.style;if((!this.options.constraint)||(this.options.constraint=="horizontal")){b.left=e[0]+"px"}if((!this.options.constraint)||(this.options.constraint=="vertical")){b.top=e[1]+"px"}if(b.visibility=="hidden"){b.visibility=""}},stopScrolling:function(){if(this.scrollInterval){clearInterval(this.scrollInterval);this.scrollInterval=null;Draggables._lastScrollPointer=null}},startScrolling:function(a){if(!(a[0]||a[1])){return}this.scrollSpeed=[a[0]*this.options.scrollSpeed,a[1]*this.options.scrollSpeed];this.lastScrolled=new Date();this.scrollInterval=setInterval(this.scroll.bind(this),10)},scroll:function(){var current=new Date();var delta=current-this.lastScrolled;this.lastScrolled=current;if(this.options.scroll==window){with(this._getWindowScroll(this.options.scroll)){if(this.scrollSpeed[0]||this.scrollSpeed[1]){var d=delta/1000;this.options.scroll.scrollTo(left+d*this.scrollSpeed[0],top+d*this.scrollSpeed[1])}}}else{this.options.scroll.scrollLeft+=this.scrollSpeed[0]*delta/1000;this.options.scroll.scrollTop+=this.scrollSpeed[1]*delta/1000}Position.prepare();Droppables.show(Draggables._lastPointer,this.element);Draggables.notify("onDrag",this);if(this._isScrollChild){Draggables._lastScrollPointer=Draggables._lastScrollPointer||$A(Draggables._lastPointer);Draggables._lastScrollPointer[0]+=this.scrollSpeed[0]*delta/1000;Draggables._lastScrollPointer[1]+=this.scrollSpeed[1]*delta/1000;if(Draggables._lastScrollPointer[0]<0){Draggables._lastScrollPointer[0]=0}if(Draggables._lastScrollPointer[1]<0){Draggables._lastScrollPointer[1]=0}this.draw(Draggables._lastScrollPointer)}if(this.options.change){this.options.change(this)}},_getWindowScroll:function(w){var T,L,W,H;with(w.document){if(w.document.documentElement&&documentElement.scrollTop){T=documentElement.scrollTop;L=documentElement.scrollLeft}else{if(w.document.body){T=body.scrollTop;L=body.scrollLeft}}if(w.innerWidth){W=w.innerWidth;H=w.innerHeight}else{if(w.document.documentElement&&documentElement.clientWidth){W=documentElement.clientWidth;H=documentElement.clientHeight}else{W=body.offsetWidth;H=body.offsetHeight}}}return{top:T,left:L,width:W,height:H}}});Draggable._dragging={};var SortableObserver=Class.create({initialize:function(b,a){this.element=$(b);this.observer=a;this.lastValue=Sortable.serialize(this.element)},onStart:function(){this.lastValue=Sortable.serialize(this.element)},onEnd:function(){Sortable.unmark();if(this.lastValue!=Sortable.serialize(this.element)){this.observer(this.element)}}});var Sortable={SERIALIZE_RULE:/^[^_\-](?:[A-Za-z0-9\-\_]*)[_](.*)$/,sortables:{},_findRootElement:function(a){while(a.tagName.toUpperCase()!="BODY"){if(a.id&&Sortable.sortables[a.id]){return a}a=a.parentNode}},options:function(a){a=Sortable._findRootElement($(a));if(!a){return}return Sortable.sortables[a.id]},destroy:function(a){a=$(a);var b=Sortable.sortables[a.id];if(b){Draggables.removeObserver(b.element);b.droppables.each(function(c){Droppables.remove(c)});b.draggables.invoke("destroy");delete Sortable.sortables[b.element.id]}},create:function(c){c=$(c);var b=Object.extend({element:c,tag:"li",dropOnEmpty:false,tree:false,treeTag:"ul",overlap:"vertical",constraint:"vertical",containment:c,handle:false,only:false,delay:0,hoverclass:null,ghosting:false,quiet:false,scroll:false,scrollSensitivity:20,scrollSpeed:15,format:this.SERIALIZE_RULE,elements:false,handles:false,onChange:Prototype.emptyFunction,onUpdate:Prototype.emptyFunction},arguments[1]||{});this.destroy(c);var a={revert:true,quiet:b.quiet,scroll:b.scroll,scrollSpeed:b.scrollSpeed,scrollSensitivity:b.scrollSensitivity,delay:b.delay,ghosting:b.ghosting,constraint:b.constraint,handle:b.handle};if(b.starteffect){a.starteffect=b.starteffect}if(b.reverteffect){a.reverteffect=b.reverteffect}else{if(b.ghosting){a.reverteffect=function(f){f.style.top=0;f.style.left=0}}}if(b.endeffect){a.endeffect=b.endeffect}if(b.zindex){a.zindex=b.zindex}var d={overlap:b.overlap,containment:b.containment,tree:b.tree,hoverclass:b.hoverclass,onHover:Sortable.onHover};var e={onHover:Sortable.onEmptyHover,overlap:b.overlap,containment:b.containment,hoverclass:b.hoverclass};Element.cleanWhitespace(c);b.draggables=[];b.droppables=[];if(b.dropOnEmpty||b.tree){Droppables.add(c,e);b.droppables.push(c)}(b.elements||this.findElements(c,b)||[]).each(function(h,f){var g=b.handles?$(b.handles[f]):(b.handle?$(h).select("."+b.handle)[0]:h);b.draggables.push(new Draggable(h,Object.extend(a,{handle:g})));Droppables.add(h,d);if(b.tree){h.treeNode=c}b.droppables.push(h)});if(b.tree){(Sortable.findTreeElements(c,b)||[]).each(function(f){Droppables.add(f,e);f.treeNode=c;b.droppables.push(f)})}this.sortables[c.identify()]=b;Draggables.addObserver(new SortableObserver(c,b.onUpdate))},findElements:function(b,a){return Element.findChildren(b,a.only,a.tree?true:false,a.tag)},findTreeElements:function(b,a){return Element.findChildren(b,a.only,a.tree?true:false,a.treeTag)},onHover:function(e,d,a){if(Element.isParent(d,e)){return}if(a>0.33&&a<0.66&&Sortable.options(d).tree){return}else{if(a>0.5){Sortable.mark(d,"before");if(d.previousSibling!=e){var b=e.parentNode;e.style.visibility="hidden";d.parentNode.insertBefore(e,d);if(d.parentNode!=b){Sortable.options(b).onChange(e)}Sortable.options(d.parentNode).onChange(e)}}else{Sortable.mark(d,"after");var c=d.nextSibling||null;if(c!=e){var b=e.parentNode;e.style.visibility="hidden";d.parentNode.insertBefore(e,c);if(d.parentNode!=b){Sortable.options(b).onChange(e)}Sortable.options(d.parentNode).onChange(e)}}}},onEmptyHover:function(e,g,h){var j=e.parentNode;var a=Sortable.options(g);if(!Element.isParent(g,e)){var f;var c=Sortable.findElements(g,{tag:a.tag,only:a.only});var b=null;if(c){var d=Element.offsetSize(g,a.overlap)*(1-h);for(f=0;f<c.length;f+=1){if(d-Element.offsetSize(c[f],a.overlap)>=0){d-=Element.offsetSize(c[f],a.overlap)}else{if(d-(Element.offsetSize(c[f],a.overlap)/2)>=0){b=f+1<c.length?c[f+1]:null;break}else{b=c[f];break}}}}g.insertBefore(e,b);Sortable.options(j).onChange(e);a.onChange(e)}},unmark:function(){if(Sortable._marker){Sortable._marker.hide()}},mark:function(b,a){var d=Sortable.options(b.parentNode);if(d&&!d.ghosting){return}if(!Sortable._marker){Sortable._marker=($("dropmarker")||Element.extend(document.createElement("DIV"))).hide().addClassName("dropmarker").setStyle({position:"absolute"});document.getElementsByTagName("body").item(0).appendChild(Sortable._marker)}var c=b.cumulativeOffset();Sortable._marker.setStyle({left:c[0]+"px",top:c[1]+"px"});if(a=="after"){if(d.overlap=="horizontal"){Sortable._marker.setStyle({left:(c[0]+b.clientWidth)+"px"})}else{Sortable._marker.setStyle({top:(c[1]+b.clientHeight)+"px"})}}Sortable._marker.show()},_tree:function(e,b,f){var d=Sortable.findElements(e,b)||[];for(var c=0;c<d.length;++c){var a=d[c].id.match(b.format);if(!a){continue}var g={id:encodeURIComponent(a?a[1]:null),element:e,parent:f,children:[],position:f.children.length,container:$(d[c]).down(b.treeTag)};if(g.container){this._tree(g.container,b,g)}f.children.push(g)}return f},tree:function(d){d=$(d);var c=this.options(d);var b=Object.extend({tag:c.tag,treeTag:c.treeTag,only:c.only,name:d.id,format:c.format},arguments[1]||{});var a={id:null,parent:null,children:[],container:d,position:0};return Sortable._tree(d,b,a)},_constructIndex:function(b){var a="";do{if(b.id){a="["+b.position+"]"+a}}while((b=b.parent)!=null);return a},sequence:function(b){b=$(b);var a=Object.extend(this.options(b),arguments[1]||{});return $(this.findElements(b,a)||[]).map(function(c){return c.id.match(a.format)?c.id.match(a.format)[1]:""})},setSequence:function(b,c){b=$(b);var a=Object.extend(this.options(b),arguments[2]||{});var d={};this.findElements(b,a).each(function(e){if(e.id.match(a.format)){d[e.id.match(a.format)[1]]=[e,e.parentNode]}e.parentNode.removeChild(e)});c.each(function(e){var f=d[e];if(f){f[1].appendChild(f[0]);delete d[e]}})},serialize:function(c){c=$(c);var b=Object.extend(Sortable.options(c),arguments[1]||{});var a=encodeURIComponent((arguments[1]&&arguments[1].name)?arguments[1].name:c.id);if(b.tree){return Sortable.tree(c,arguments[1]).children.map(function(d){return[a+Sortable._constructIndex(d)+"[id]="+encodeURIComponent(d.id)].concat(d.children.map(arguments.callee))}).flatten().join("&")}else{return Sortable.sequence(c,arguments[1]).map(function(d){return a+"[]="+encodeURIComponent(d)}).join("&")}}};Element.isParent=function(b,a){if(!b.parentNode||b==a){return false}if(b.parentNode==a){return true}return Element.isParent(b.parentNode,a)};Element.findChildren=function(d,b,a,c){if(!d.hasChildNodes()){return null}c=c.toUpperCase();if(b){b=[b].flatten()}var e=[];$A(d.childNodes).each(function(g){if(g.tagName&&g.tagName.toUpperCase()==c&&(!b||(Element.classNames(g).detect(function(h){return b.include(h)})))){e.push(g)}if(a){var f=Element.findChildren(g,b,a,c);if(f){e.push(f)}}});return(e.length>0?e.flatten():[])};Element.offsetSize=function(a,b){return a["offset"+((b=="vertical"||b=="height")?"Height":"Width")]};if(typeof Effect=="undefined"){throw ("controls.js requires including script.aculo.us' effects.js library")}var Autocompleter={};Autocompleter.Base=Class.create({baseInitialize:function(b,c,a){b=$(b);this.element=b;this.update=$(c);this.hasFocus=false;this.changed=false;this.active=false;this.index=0;this.entryCount=0;this.oldElementValue=this.element.value;if(this.setOptions){this.setOptions(a)}else{this.options=a||{}}this.options.paramName=this.options.paramName||this.element.name;this.options.tokens=this.options.tokens||[];this.options.frequency=this.options.frequency||0.4;this.options.minChars=this.options.minChars||1;this.options.onShow=this.options.onShow||function(d,e){if(!e.style.position||e.style.position=="absolute"){e.style.position="absolute";Position.clone(d,e,{setHeight:false,offsetTop:d.offsetHeight})}Effect.Appear(e,{duration:0.15})};this.options.onHide=this.options.onHide||function(d,e){new Effect.Fade(e,{duration:0.15})};if(typeof(this.options.tokens)=="string"){this.options.tokens=new Array(this.options.tokens)}if(!this.options.tokens.include("\n")){this.options.tokens.push("\n")}this.observer=null;this.element.setAttribute("autocomplete","off");Element.hide(this.update);Event.observe(this.element,"blur",this.onBlur.bindAsEventListener(this));Event.observe(this.element,"keydown",this.onKeyPress.bindAsEventListener(this))},show:function(){if(Element.getStyle(this.update,"display")=="none"){this.options.onShow(this.element,this.update)}if(!this.iefix&&(Prototype.Browser.IE)&&(Element.getStyle(this.update,"position")=="absolute")){new Insertion.After(this.update,'<iframe id="'+this.update.id+'_iefix" style="display:none;position:absolute;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0);" src="javascript:false;" frameborder="0" scrolling="no"></iframe>');this.iefix=$(this.update.id+"_iefix")}if(this.iefix){setTimeout(this.fixIEOverlapping.bind(this),50)}},fixIEOverlapping:function(){Position.clone(this.update,this.iefix,{setTop:(!this.update.style.height)});this.iefix.style.zIndex=1;this.update.style.zIndex=2;Element.show(this.iefix)},hide:function(){this.stopIndicator();if(Element.getStyle(this.update,"display")!="none"){this.options.onHide(this.element,this.update)}if(this.iefix){Element.hide(this.iefix)}},startIndicator:function(){if(this.options.indicator){Element.show(this.options.indicator)}},stopIndicator:function(){if(this.options.indicator){Element.hide(this.options.indicator)}},onKeyPress:function(a){if(this.active){switch(a.keyCode){case Event.KEY_TAB:case Event.KEY_RETURN:this.selectEntry();Event.stop(a);case Event.KEY_ESC:this.hide();this.active=false;Event.stop(a);return;case Event.KEY_LEFT:case Event.KEY_RIGHT:return;case Event.KEY_UP:this.markPrevious();this.render();Event.stop(a);return;case Event.KEY_DOWN:this.markNext();this.render();Event.stop(a);return}}else{if(a.keyCode==Event.KEY_TAB||a.keyCode==Event.KEY_RETURN||(Prototype.Browser.WebKit>0&&a.keyCode==0)){return}}this.changed=true;this.hasFocus=true;if(this.observer){clearTimeout(this.observer)}this.observer=setTimeout(this.onObserverEvent.bind(this),this.options.frequency*1000)},activate:function(){this.changed=false;this.hasFocus=true;this.getUpdatedChoices()},onHover:function(b){var a=Event.findElement(b,"LI");if(this.index!=a.autocompleteIndex){this.index=a.autocompleteIndex;this.render()}Event.stop(b)},onClick:function(b){var a=Event.findElement(b,"LI");this.index=a.autocompleteIndex;this.selectEntry();this.hide()},onBlur:function(a){setTimeout(this.hide.bind(this),250);this.hasFocus=false;this.active=false},render:function(){if(this.entryCount>0){for(var a=0;a<this.entryCount;a++){this.index==a?Element.addClassName(this.getEntry(a),"selected"):Element.removeClassName(this.getEntry(a),"selected")}if(this.hasFocus){this.show();this.active=true}}else{this.active=false;this.hide()}},markPrevious:function(){if(this.index>0){this.index--}else{this.index=this.entryCount-1}this.getEntry(this.index).scrollIntoView(true)},markNext:function(){if(this.index<this.entryCount-1){this.index++}else{this.index=0}this.getEntry(this.index).scrollIntoView(false)},getEntry:function(a){return this.update.firstChild.childNodes[a]},getCurrentEntry:function(){return this.getEntry(this.index)},selectEntry:function(){this.active=false;this.updateElement(this.getCurrentEntry())},updateElement:function(f){if(this.options.updateElement){this.options.updateElement(f);return}var d="";if(this.options.select){var a=$(f).select("."+this.options.select)||[];if(a.length>0){d=Element.collectTextNodes(a[0],this.options.select)}}else{d=Element.collectTextNodesIgnoreClass(f,"informal")}var c=this.getTokenBounds();if(c[0]!=-1){var e=this.element.value.substr(0,c[0]);var b=this.element.value.substr(c[0]).match(/^\s+/);if(b){e+=b[0]}this.element.value=e+d+this.element.value.substr(c[1])}else{this.element.value=d}this.oldElementValue=this.element.value;this.element.focus();if(this.options.afterUpdateElement){this.options.afterUpdateElement(this.element,f)}},updateChoices:function(c){if(!this.changed&&this.hasFocus){this.update.innerHTML=c;Element.cleanWhitespace(this.update);Element.cleanWhitespace(this.update.down());if(this.update.firstChild&&this.update.down().childNodes){this.entryCount=this.update.down().childNodes.length;for(var a=0;a<this.entryCount;a++){var b=this.getEntry(a);b.autocompleteIndex=a;this.addObservers(b)}}else{this.entryCount=0}this.stopIndicator();this.index=0;if(this.entryCount==1&&this.options.autoSelect){this.selectEntry();this.hide()}else{this.render()}}},addObservers:function(a){Event.observe(a,"mouseover",this.onHover.bindAsEventListener(this));Event.observe(a,"click",this.onClick.bindAsEventListener(this))},onObserverEvent:function(){this.changed=false;this.tokenBounds=null;if(this.getToken().length>=this.options.minChars){this.getUpdatedChoices()}else{this.active=false;this.hide()}this.oldElementValue=this.element.value},getToken:function(){var a=this.getTokenBounds();return this.element.value.substring(a[0],a[1]).strip()},getTokenBounds:function(){if(null!=this.tokenBounds){return this.tokenBounds}var e=this.element.value;if(e.strip().empty()){return[-1,0]}var f=arguments.callee.getFirstDifferencePos(e,this.oldElementValue);var h=(f==this.oldElementValue.length?1:0);var d=-1,c=e.length;var g;for(var b=0,a=this.options.tokens.length;b<a;++b){g=e.lastIndexOf(this.options.tokens[b],f+h-1);if(g>d){d=g}g=e.indexOf(this.options.tokens[b],f+h);if(-1!=g&&g<c){c=g}}return(this.tokenBounds=[d+1,c])}});Autocompleter.Base.prototype.getTokenBounds.getFirstDifferencePos=function(c,a){var d=Math.min(c.length,a.length);for(var b=0;b<d;++b){if(c[b]!=a[b]){return b}}return d};Ajax.Autocompleter=Class.create(Autocompleter.Base,{initialize:function(c,d,b,a){this.baseInitialize(c,d,a);this.options.asynchronous=true;this.options.onComplete=this.onComplete.bind(this);this.options.defaultParams=this.options.parameters||null;this.url=b},getUpdatedChoices:function(){this.startIndicator();var a=encodeURIComponent(this.options.paramName)+"="+encodeURIComponent(this.getToken());this.options.parameters=this.options.callback?this.options.callback(this.element,a):a;if(this.options.defaultParams){this.options.parameters+="&"+this.options.defaultParams}new Ajax.Request(this.url,this.options)},onComplete:function(a){this.updateChoices(a.responseText)}});Autocompleter.Local=Class.create(Autocompleter.Base,{initialize:function(b,d,c,a){this.baseInitialize(b,d,a);this.options.array=c},getUpdatedChoices:function(){this.updateChoices(this.options.selector(this))},setOptions:function(a){this.options=Object.extend({choices:10,partialSearch:true,partialChars:2,ignoreCase:true,fullSearch:false,selector:function(b){var d=[];var c=[];var h=b.getToken();var g=0;for(var e=0;e<b.options.array.length&&d.length<b.options.choices;e++){var f=b.options.array[e];var j=b.options.ignoreCase?f.toLowerCase().indexOf(h.toLowerCase()):f.indexOf(h);while(j!=-1){if(j==0&&f.length!=h.length){d.push("<li><strong>"+f.substr(0,h.length)+"</strong>"+f.substr(h.length)+"</li>");break}else{if(h.length>=b.options.partialChars&&b.options.partialSearch&&j!=-1){if(b.options.fullSearch||/\s/.test(f.substr(j-1,1))){c.push("<li>"+f.substr(0,j)+"<strong>"+f.substr(j,h.length)+"</strong>"+f.substr(j+h.length)+"</li>");break}}}j=b.options.ignoreCase?f.toLowerCase().indexOf(h.toLowerCase(),j+1):f.indexOf(h,j+1)}}if(c.length){d=d.concat(c.slice(0,b.options.choices-d.length))}return"<ul>"+d.join("")+"</ul>"}},a||{})}});Field.scrollFreeActivate=function(a){setTimeout(function(){Field.activate(a)},1)};Ajax.InPlaceEditor=Class.create({initialize:function(c,b,a){this.url=b;this.element=c=$(c);this.prepareOptions();this._controls={};arguments.callee.dealWithDeprecatedOptions(a);Object.extend(this.options,a||{});if(!this.options.formId&&this.element.id){this.options.formId=this.element.id+"-inplaceeditor";if($(this.options.formId)){this.options.formId=""}}if(this.options.externalControl){this.options.externalControl=$(this.options.externalControl)}if(!this.options.externalControl){this.options.externalControlOnly=false}this._originalBackground=this.element.getStyle("background-color")||"transparent";this.element.title=this.options.clickToEditText;this._boundCancelHandler=this.handleFormCancellation.bind(this);this._boundComplete=(this.options.onComplete||Prototype.emptyFunction).bind(this);this._boundFailureHandler=this.handleAJAXFailure.bind(this);this._boundSubmitHandler=this.handleFormSubmission.bind(this);this._boundWrapperHandler=this.wrapUp.bind(this);this.registerListeners()},checkForEscapeOrReturn:function(a){if(!this._editing||a.ctrlKey||a.altKey||a.shiftKey){return}if(Event.KEY_ESC==a.keyCode){this.handleFormCancellation(a)}else{if(Event.KEY_RETURN==a.keyCode){this.handleFormSubmission(a)}}},createControl:function(g,c,b){var e=this.options[g+"Control"];var f=this.options[g+"Text"];if("button"==e){var a=document.createElement("input");a.type="submit";a.value=f;a.className="editor_"+g+"_button";if("cancel"==g){a.onclick=this._boundCancelHandler}this._form.appendChild(a);this._controls[g]=a}else{if("link"==e){var d=document.createElement("a");d.href="#";d.appendChild(document.createTextNode(f));d.onclick="cancel"==g?this._boundCancelHandler:this._boundSubmitHandler;d.className="editor_"+g+"_link";if(b){d.className+=" "+b}this._form.appendChild(d);this._controls[g]=d}}},createEditField:function(){var c=(this.options.loadTextURL?this.options.loadingText:this.getText());var b;if(1>=this.options.rows&&!/\r|\n/.test(this.getText())){b=document.createElement("input");b.type="text";var a=this.options.size||this.options.cols||0;if(0<a){b.size=a}}else{b=document.createElement("textarea");b.rows=(1>=this.options.rows?this.options.autoRows:this.options.rows);b.cols=this.options.cols||40}b.name=this.options.paramName;b.value=c;b.className="editor_field";if(this.options.submitOnBlur){b.onblur=this._boundSubmitHandler}this._controls.editor=b;if(this.options.loadTextURL){this.loadExternalText()}this._form.appendChild(this._controls.editor)},createForm:function(){var b=this;function a(d,e){var c=b.options["text"+d+"Controls"];if(!c||e===false){return}b._form.appendChild(document.createTextNode(c))}this._form=$(document.createElement("form"));this._form.id=this.options.formId;this._form.addClassName(this.options.formClassName);this._form.onsubmit=this._boundSubmitHandler;this.createEditField();if("textarea"==this._controls.editor.tagName.toLowerCase()){this._form.appendChild(document.createElement("br"))}if(this.options.onFormCustomization){this.options.onFormCustomization(this,this._form)}a("Before",this.options.okControl||this.options.cancelControl);this.createControl("ok",this._boundSubmitHandler);a("Between",this.options.okControl&&this.options.cancelControl);this.createControl("cancel",this._boundCancelHandler,"editor_cancel");a("After",this.options.okControl||this.options.cancelControl)},destroy:function(){if(this._oldInnerHTML){this.element.innerHTML=this._oldInnerHTML}this.leaveEditMode();this.unregisterListeners()},enterEditMode:function(a){if(this._saving||this._editing){return}this._editing=true;this.triggerCallback("onEnterEditMode");if(this.options.externalControl){this.options.externalControl.hide()}this.element.hide();this.createForm();this.element.parentNode.insertBefore(this._form,this.element);if(!this.options.loadTextURL){this.postProcessEditField()}if(a){Event.stop(a)}},enterHover:function(a){if(this.options.hoverClassName){this.element.addClassName(this.options.hoverClassName)}if(this._saving){return}this.triggerCallback("onEnterHover")},getText:function(){return this.element.innerHTML.unescapeHTML()},handleAJAXFailure:function(a){this.triggerCallback("onFailure",a);if(this._oldInnerHTML){this.element.innerHTML=this._oldInnerHTML;this._oldInnerHTML=null}},handleFormCancellation:function(a){this.wrapUp();if(a){Event.stop(a)}},handleFormSubmission:function(d){var b=this._form;var c=$F(this._controls.editor);this.prepareSubmission();var f=this.options.callback(b,c)||"";if(Object.isString(f)){f=f.toQueryParams()}f.editorId=this.element.id;if(this.options.htmlResponse){var a=Object.extend({evalScripts:true},this.options.ajaxOptions);Object.extend(a,{parameters:f,onComplete:this._boundWrapperHandler,onFailure:this._boundFailureHandler});new Ajax.Updater({success:this.element},this.url,a)}else{var a=Object.extend({method:"get"},this.options.ajaxOptions);Object.extend(a,{parameters:f,onComplete:this._boundWrapperHandler,onFailure:this._boundFailureHandler});new Ajax.Request(this.url,a)}if(d){Event.stop(d)}},leaveEditMode:function(){this.element.removeClassName(this.options.savingClassName);this.removeForm();this.leaveHover();this.element.style.backgroundColor=this._originalBackground;this.element.show();if(this.options.externalControl){this.options.externalControl.show()}this._saving=false;this._editing=false;this._oldInnerHTML=null;this.triggerCallback("onLeaveEditMode")},leaveHover:function(a){if(this.options.hoverClassName){this.element.removeClassName(this.options.hoverClassName)}if(this._saving){return}this.triggerCallback("onLeaveHover")},loadExternalText:function(){this._form.addClassName(this.options.loadingClassName);this._controls.editor.disabled=true;var a=Object.extend({method:"get"},this.options.ajaxOptions);Object.extend(a,{parameters:"editorId="+encodeURIComponent(this.element.id),onComplete:Prototype.emptyFunction,onSuccess:function(c){this._form.removeClassName(this.options.loadingClassName);var b=c.responseText;if(this.options.stripLoadedTextTags){b=b.stripTags()}this._controls.editor.value=b;this._controls.editor.disabled=false;this.postProcessEditField()}.bind(this),onFailure:this._boundFailureHandler});new Ajax.Request(this.options.loadTextURL,a)},postProcessEditField:function(){var a=this.options.fieldPostCreation;if(a){$(this._controls.editor)["focus"==a?"focus":"activate"]()}},prepareOptions:function(){this.options=Object.clone(Ajax.InPlaceEditor.DefaultOptions);Object.extend(this.options,Ajax.InPlaceEditor.DefaultCallbacks);[this._extraDefaultOptions].flatten().compact().each(function(a){Object.extend(this.options,a)}.bind(this))},prepareSubmission:function(){this._saving=true;this.removeForm();this.leaveHover();this.showSaving()},registerListeners:function(){this._listeners={};var a;$H(Ajax.InPlaceEditor.Listeners).each(function(b){a=this[b.value].bind(this);this._listeners[b.key]=a;if(!this.options.externalControlOnly){this.element.observe(b.key,a)}if(this.options.externalControl){this.options.externalControl.observe(b.key,a)}}.bind(this))},removeForm:function(){if(!this._form){return}this._form.remove();this._form=null;this._controls={}},showSaving:function(){this._oldInnerHTML=this.element.innerHTML;this.element.innerHTML=this.options.savingText;this.element.addClassName(this.options.savingClassName);this.element.style.backgroundColor=this._originalBackground;this.element.show()},triggerCallback:function(b,a){if("function"==typeof this.options[b]){this.options[b](this,a)}},unregisterListeners:function(){$H(this._listeners).each(function(a){if(!this.options.externalControlOnly){this.element.stopObserving(a.key,a.value)}if(this.options.externalControl){this.options.externalControl.stopObserving(a.key,a.value)}}.bind(this))},wrapUp:function(a){this.leaveEditMode();this._boundComplete(a,this.element)}});Object.extend(Ajax.InPlaceEditor.prototype,{dispose:Ajax.InPlaceEditor.prototype.destroy});Ajax.InPlaceCollectionEditor=Class.create(Ajax.InPlaceEditor,{initialize:function($super,c,b,a){this._extraDefaultOptions=Ajax.InPlaceCollectionEditor.DefaultOptions;$super(c,b,a)},createEditField:function(){var a=document.createElement("select");a.name=this.options.paramName;a.size=1;this._controls.editor=a;this._collection=this.options.collection||[];if(this.options.loadCollectionURL){this.loadCollection()}else{this.checkForExternalText()}this._form.appendChild(this._controls.editor)},loadCollection:function(){this._form.addClassName(this.options.loadingClassName);this.showLoadingText(this.options.loadingCollectionText);var options=Object.extend({method:"get"},this.options.ajaxOptions);Object.extend(options,{parameters:"editorId="+encodeURIComponent(this.element.id),onComplete:Prototype.emptyFunction,onSuccess:function(transport){var js=transport.responseText.strip();if(!/^\[.*\]$/.test(js)){throw ("Server returned an invalid collection representation.")}this._collection=eval(js);this.checkForExternalText()}.bind(this),onFailure:this.onFailure});new Ajax.Request(this.options.loadCollectionURL,options)},showLoadingText:function(b){this._controls.editor.disabled=true;var a=this._controls.editor.firstChild;if(!a){a=document.createElement("option");a.value="";this._controls.editor.appendChild(a);a.selected=true}a.update((b||"").stripScripts().stripTags())},checkForExternalText:function(){this._text=this.getText();if(this.options.loadTextURL){this.loadExternalText()}else{this.buildOptionList()}},loadExternalText:function(){this.showLoadingText(this.options.loadingText);var a=Object.extend({method:"get"},this.options.ajaxOptions);Object.extend(a,{parameters:"editorId="+encodeURIComponent(this.element.id),onComplete:Prototype.emptyFunction,onSuccess:function(b){this._text=b.responseText.strip();this.buildOptionList()}.bind(this),onFailure:this.onFailure});new Ajax.Request(this.options.loadTextURL,a)},buildOptionList:function(){this._form.removeClassName(this.options.loadingClassName);this._collection=this._collection.map(function(d){return 2===d.length?d:[d,d].flatten()});var b=("value" in this.options)?this.options.value:this._text;var a=this._collection.any(function(d){return d[0]==b}.bind(this));this._controls.editor.update("");var c;this._collection.each(function(e,d){c=document.createElement("option");c.value=e[0];c.selected=a?e[0]==b:0==d;c.appendChild(document.createTextNode(e[1]));this._controls.editor.appendChild(c)}.bind(this));this._controls.editor.disabled=false;Field.scrollFreeActivate(this._controls.editor)}});Ajax.InPlaceEditor.prototype.initialize.dealWithDeprecatedOptions=function(a){if(!a){return}function b(c,d){if(c in a||d===undefined){return}a[c]=d}b("cancelControl",(a.cancelLink?"link":(a.cancelButton?"button":a.cancelLink==a.cancelButton==false?false:undefined)));b("okControl",(a.okLink?"link":(a.okButton?"button":a.okLink==a.okButton==false?false:undefined)));b("highlightColor",a.highlightcolor);b("highlightEndColor",a.highlightendcolor)};Object.extend(Ajax.InPlaceEditor,{DefaultOptions:{ajaxOptions:{},autoRows:3,cancelControl:"link",cancelText:"cancel",clickToEditText:"Click to edit",externalControl:null,externalControlOnly:false,fieldPostCreation:"activate",formClassName:"inplaceeditor-form",formId:null,highlightColor:"#ffff99",highlightEndColor:"#ffffff",hoverClassName:"",htmlResponse:true,loadingClassName:"inplaceeditor-loading",loadingText:"Loading...",okControl:"button",okText:"ok",paramName:"value",rows:1,savingClassName:"inplaceeditor-saving",savingText:"Saving...",size:0,stripLoadedTextTags:false,submitOnBlur:false,textAfterControls:"",textBeforeControls:"",textBetweenControls:""},DefaultCallbacks:{callback:function(a){return Form.serialize(a)},onComplete:function(b,a){new Effect.Highlight(a,{startcolor:this.options.highlightColor,keepBackgroundImage:true})},onEnterEditMode:null,onEnterHover:function(a){a.element.style.backgroundColor=a.options.highlightColor;if(a._effect){a._effect.cancel()}},onFailure:function(b,a){alert("Error communication with the server: "+b.responseText.stripTags())},onFormCustomization:null,onLeaveEditMode:null,onLeaveHover:function(a){a._effect=new Effect.Highlight(a.element,{startcolor:a.options.highlightColor,endcolor:a.options.highlightEndColor,restorecolor:a._originalBackground,keepBackgroundImage:true})}},Listeners:{click:"enterEditMode",keydown:"checkForEscapeOrReturn",mouseover:"enterHover",mouseout:"leaveHover"}});Ajax.InPlaceCollectionEditor.DefaultOptions={loadingCollectionText:"Loading options..."};Form.Element.DelayedObserver=Class.create({initialize:function(b,a,c){this.delay=a||0.5;this.element=$(b);this.callback=c;this.timer=null;this.lastValue=$F(this.element);Event.observe(this.element,"keyup",this.delayedListener.bindAsEventListener(this))},delayedListener:function(a){if(this.lastValue==$F(this.element)){return}if(this.timer){clearTimeout(this.timer)}this.timer=setTimeout(this.onTimerEvent.bind(this),this.delay*1000);this.lastValue=$F(this.element)},onTimerEvent:function(){this.timer=null;this.callback(this.element,$F(this.element))}});if(!Control){var Control={}}Control.Slider=Class.create({initialize:function(d,a,b){var c=this;if(Object.isArray(d)){this.handles=d.collect(function(f){return $(f)})}else{this.handles=[$(d)]}this.track=$(a);this.options=b||{};this.axis=this.options.axis||"horizontal";this.increment=this.options.increment||1;this.step=parseInt(this.options.step||"1");this.range=this.options.range||$R(0,1);this.value=0;this.values=this.handles.map(function(){return 0});this.spans=this.options.spans?this.options.spans.map(function(e){return $(e)}):false;this.options.startSpan=$(this.options.startSpan||null);this.options.endSpan=$(this.options.endSpan||null);this.restricted=this.options.restricted||false;this.maximum=this.options.maximum||this.range.end;this.minimum=this.options.minimum||this.range.start;this.alignX=parseInt(this.options.alignX||"0");this.alignY=parseInt(this.options.alignY||"0");this.trackLength=this.maximumOffset()-this.minimumOffset();this.handleLength=this.isVertical()?(this.handles[0].offsetHeight!=0?this.handles[0].offsetHeight:this.handles[0].style.height.replace(/px$/,"")):(this.handles[0].offsetWidth!=0?this.handles[0].offsetWidth:this.handles[0].style.width.replace(/px$/,""));this.active=false;this.dragging=false;this.disabled=false;if(this.options.disabled){this.setDisabled()}this.allowedValues=this.options.values?this.options.values.sortBy(Prototype.K):false;if(this.allowedValues){this.minimum=this.allowedValues.min();this.maximum=this.allowedValues.max()}this.eventMouseDown=this.startDrag.bindAsEventListener(this);this.eventMouseUp=this.endDrag.bindAsEventListener(this);this.eventMouseMove=this.update.bindAsEventListener(this);this.handles.each(function(f,e){e=c.handles.length-1-e;c.setValue(parseFloat((Object.isArray(c.options.sliderValue)?c.options.sliderValue[e]:c.options.sliderValue)||c.range.start),e);f.makePositioned().observe("mousedown",c.eventMouseDown)});this.track.observe("mousedown",this.eventMouseDown);document.observe("mouseup",this.eventMouseUp);document.observe("mousemove",this.eventMouseMove);this.initialized=true},dispose:function(){var a=this;Event.stopObserving(this.track,"mousedown",this.eventMouseDown);Event.stopObserving(document,"mouseup",this.eventMouseUp);Event.stopObserving(document,"mousemove",this.eventMouseMove);this.handles.each(function(b){Event.stopObserving(b,"mousedown",a.eventMouseDown)})},setDisabled:function(){this.disabled=true},setEnabled:function(){this.disabled=false},getNearestValue:function(a){if(this.allowedValues){if(a>=this.allowedValues.max()){return(this.allowedValues.max())}if(a<=this.allowedValues.min()){return(this.allowedValues.min())}var c=Math.abs(this.allowedValues[0]-a);var b=this.allowedValues[0];this.allowedValues.each(function(d){var e=Math.abs(d-a);if(e<=c){b=d;c=e}});return b}if(a>this.range.end){return this.range.end}if(a<this.range.start){return this.range.start}return a},setValue:function(b,a){if(!this.active){this.activeHandleIdx=a||0;this.activeHandle=this.handles[this.activeHandleIdx];this.updateStyles()}a=a||this.activeHandleIdx||0;if(this.initialized&&this.restricted){if((a>0)&&(b<this.values[a-1])){b=this.values[a-1]}if((a<(this.handles.length-1))&&(b>this.values[a+1])){b=this.values[a+1]}}b=this.getNearestValue(b);this.values[a]=b;this.value=this.values[0];this.handles[a].style[this.isVertical()?"top":"left"]=this.translateToPx(b);this.drawSpans();if(!this.dragging||!this.event){this.updateFinished()}},setValueBy:function(b,a){this.setValue(this.values[a||this.activeHandleIdx||0]+b,a||this.activeHandleIdx||0)},translateToPx:function(a){return Math.round(((this.trackLength-this.handleLength)/(this.range.end-this.range.start))*(a-this.range.start))+"px"},translateToValue:function(a){return((a/(this.trackLength-this.handleLength)*(this.range.end-this.range.start))+this.range.start)},getRange:function(b){var a=this.values.sortBy(Prototype.K);b=b||0;return $R(a[b],a[b+1])},minimumOffset:function(){return(this.isVertical()?this.alignY:this.alignX)},maximumOffset:function(){return(this.isVertical()?(this.track.offsetHeight!=0?this.track.offsetHeight:this.track.style.height.replace(/px$/,""))-this.alignY:(this.track.offsetWidth!=0?this.track.offsetWidth:this.track.style.width.replace(/px$/,""))-this.alignX)},isVertical:function(){return(this.axis=="vertical")},drawSpans:function(){var a=this;if(this.spans){$R(0,this.spans.length-1).each(function(b){a.setSpan(a.spans[b],a.getRange(b))})}if(this.options.startSpan){this.setSpan(this.options.startSpan,$R(0,this.values.length>1?this.getRange(0).min():this.value))}if(this.options.endSpan){this.setSpan(this.options.endSpan,$R(this.values.length>1?this.getRange(this.spans.length-1).max():this.value,this.maximum))}},setSpan:function(b,a){if(this.isVertical()){b.style.top=this.translateToPx(a.start);b.style.height=this.translateToPx(a.end-a.start+this.range.start)}else{b.style.left=this.translateToPx(a.start);b.style.width=this.translateToPx(a.end-a.start+this.range.start)}},updateStyles:function(){this.handles.each(function(a){Element.removeClassName(a,"selected")});Element.addClassName(this.activeHandle,"selected")},startDrag:function(c){if(Event.isLeftClick(c)){if(!this.disabled){this.active=true;var d=Event.element(c);var e=[Event.pointerX(c),Event.pointerY(c)];var a=d;if(a==this.track){var b=this.track.cumulativeOffset();this.event=c;this.setValue(this.translateToValue((this.isVertical()?e[1]-b[1]:e[0]-b[0])-(this.handleLength/2)));var b=this.activeHandle.cumulativeOffset();this.offsetX=(e[0]-b[0]);this.offsetY=(e[1]-b[1])}else{while((this.handles.indexOf(d)==-1)&&d.parentNode){d=d.parentNode}if(this.handles.indexOf(d)!=-1){this.activeHandle=d;this.activeHandleIdx=this.handles.indexOf(this.activeHandle);this.updateStyles();var b=this.activeHandle.cumulativeOffset();this.offsetX=(e[0]-b[0]);this.offsetY=(e[1]-b[1])}}}Event.stop(c)}},update:function(a){if(this.active){if(!this.dragging){this.dragging=true}this.draw(a);if(Prototype.Browser.WebKit){window.scrollBy(0,0)}Event.stop(a)}},draw:function(b){var c=[Event.pointerX(b),Event.pointerY(b)];var a=this.track.cumulativeOffset();c[0]-=this.offsetX+a[0];c[1]-=this.offsetY+a[1];this.event=b;this.setValue(this.translateToValue(this.isVertical()?c[1]:c[0]));if(this.initialized&&this.options.onSlide){this.options.onSlide(this.values.length>1?this.values:this.value,this)}},endDrag:function(a){if(this.active&&this.dragging){this.finishDrag(a,true);Event.stop(a)}this.active=false;this.dragging=false},finishDrag:function(a,b){this.active=false;this.dragging=false;this.updateFinished()},updateFinished:function(){if(this.initialized&&this.options.onChange){this.options.onChange(this.values.length>1?this.values:this.value,this)}this.event=null}});Sound={tracks:{},_enabled:true,template:new Template('<embed style="height:0" id="sound_#{track}_#{id}" src="#{url}" loop="false" autostart="true" hidden="true"/>'),enable:function(){Sound._enabled=true},disable:function(){Sound._enabled=false},play:function(b){if(!Sound._enabled){return}var a=Object.extend({track:"global",url:b,replace:false},arguments[1]||{});if(a.replace&&this.tracks[a.track]){$R(0,this.tracks[a.track].id).each(function(d){var c=$("sound_"+a.track+"_"+d);c.Stop&&c.Stop();c.remove()});this.tracks[a.track]=null}if(!this.tracks[a.track]){this.tracks[a.track]={id:0}}else{this.tracks[a.track].id++}a.id=this.tracks[a.track].id;$$("body")[0].insert(Prototype.Browser.IE?new Element("bgsound",{id:"sound_"+a.track+"_"+a.id,src:a.url,loop:1,autostart:true}):Sound.template.evaluate(a))}};if(Prototype.Browser.Gecko&&navigator.userAgent.indexOf("Win")>0){if(navigator.plugins&&$A(navigator.plugins).detect(function(a){return a.name.indexOf("QuickTime")!=-1})){Sound.template=new Template('<object id="sound_#{track}_#{id}" width="0" height="0" type="audio/mpeg" data="#{url}"/>')}else{if(navigator.plugins&&$A(navigator.plugins).detect(function(a){return a.name.indexOf("Windows Media")!=-1})){Sound.template=new Template('<object id="sound_#{track}_#{id}" type="application/x-mplayer2" data="#{url}"></object>')}else{if(navigator.plugins&&$A(navigator.plugins).detect(function(a){return a.name.indexOf("RealPlayer")!=-1})){Sound.template=new Template('<embed type="audio/x-pn-realaudio-plugin" style="height:0" id="sound_#{track}_#{id}" src="#{url}" loop="false" autostart="true" hidden="true"/>')}else{Sound.play=function(){}}}}};//contains scriptaculous as well
/*
offers the following variables
most are booleans, but some are 
numbers when dealing with versions

Is.aix	
Is.all	
Is.anchors	
Is.aol
Is.AOLTV
Is.bsd
Is.cookie
Is.dec
Is.documentElement
Is.fb
Is.Flash
Is.FlashVersion
Is.forms
Is.frames
Is.freebsd
Is.fx
Is.gecko
Is.getElementById
Is.getElementsByTagName
Is.gver
Is.hotjava
Is.hpux
Is.ie
Is.images
Is.irix
Is.java
Is.js
Is.khtml
Is.konq
Is.layers
Is.links
Is.linux
Is.mac
Is.macppc
Is.major
Is.minor
Is.moz
Is.mpras
Is.nav
Is.navonly
Is.opera
Is.option
Is.os
Is.paren
Is.regexp
Is.reliant
Is.safari
Is.sco
Is.screen
Is.sinix
Is.sun
Is.suni
Is.TVNavigator
Is.unix
Is.unixware
Is.vms
Is.webtv
Is.win
Is.winme
Is.winnt
Is.winxp
*/


var Is = {};
(function() {
    // convert all characters to lowercase to simplify testing
    var agt=navigator.userAgent.toLowerCase();
    var appVer = navigator.appVersion.toLowerCase();

    // *** BROWSER VERSION ***
    Is.minor = parseFloat(appVer);
    Is.major = parseInt(Is.minor);

    Is.opera = (agt.indexOf("opera") != -1);
    Is.opera2 = (agt.indexOf("opera 2") != -1 || agt.indexOf("opera/2") != -1);
    Is.opera3 = (agt.indexOf("opera 3") != -1 || agt.indexOf("opera/3") != -1);
    Is.opera4 = (agt.indexOf("opera 4") != -1 || agt.indexOf("opera/4") != -1);
    Is.opera5 = (agt.indexOf("opera 5") != -1 || agt.indexOf("opera/5") != -1);
    Is.opera6 = (agt.indexOf("opera 6") != -1 || agt.indexOf("opera/6") != -1); // new 020128- abk
    Is.opera7 = (agt.indexOf("opera 7") != -1 || agt.indexOf("opera/7") != -1); // new 021205- dmr
    Is.opera5up = (Is.opera && !Is.opera2 && !Is.opera3 && !Is.opera4);
    Is.opera6up = (Is.opera && !Is.opera2 && !Is.opera3 && !Is.opera4 && !Is.opera5); // new020128
    Is.opera7up = (Is.opera && !Is.opera2 && !Is.opera3 && !Is.opera4 && !Is.opera5 && !Is.opera6); // new021205 -- dmr

    // Note: On IE, start of appVersion return 3 or 4
    // which supposedly is the version of Netscape it is compatible with.
    // So we look for the real version further on in the string
    // And on Mac IE5+, we look for Is.minor in the ua; since 
    // it appears to be more accurate than appVersion - 06/17/2004

    Is.mac = (agt.indexOf("mac")!=-1);
    var iePos  = appVer.indexOf('msie');
    if (iePos !=-1) {
       if(Is.mac) {
           var iePos = agt.indexOf('msie');
           Is.minor = parseFloat(agt.substring(iePos+5,agt.indexOf(';',iePos)));
       }
       else Is.minor = parseFloat(appVer.substring(iePos+5,appVer.indexOf(';',iePos)));
       Is.major = parseInt(Is.minor);
    }

    // ditto Konqueror
                                      
    Is.konq = false;
    var kqPos   = agt.indexOf('konqueror');
    if (kqPos !=-1) {                 
       Is.konq  = true;
       Is.minor = parseFloat(agt.substring(kqPos+10,agt.indexOf(';',kqPos)));
       Is.major = parseInt(Is.minor);
    }                                 

    Is.getElementById   = ($) ? "true" : "false"; // 001121-abk
    Is.getElementsByTagName = (document.getElementsByTagName) ? "true" : "false"; // 001127-abk
    Is.documentElement = (document.documentElement) ? "true" : "false"; // 001121-abk

    Is.safari = ((agt.indexOf('safari')!=-1)&&(agt.indexOf('mac')!=-1))?true:false;
    Is.khtml  = (Is.safari || Is.konq);

    Is.gecko = ((!Is.khtml)&&(navigator.product)&&(navigator.product.toLowerCase()=="gecko"))?true:false;
    Is.gver  = 0;
    if (Is.gecko) Is.gver=navigator.productSub;

    Is.moz   = ((agt.indexOf('mozilla/5')!=-1) && (agt.indexOf('spoofer')==-1) &&
                    (agt.indexOf('compatible')==-1) && (agt.indexOf('opera')==-1)  &&
                    (agt.indexOf('webtv')==-1) && (agt.indexOf('hotjava')==-1)     &&
                    (Is.gecko) && 
                    ((navigator.vendor=="")||(navigator.vendor=="Mozilla")||(navigator.vendor=="Debian")));
    Is.fb = ((agt.indexOf('mozilla/5')!=-1) && (agt.indexOf('spoofer')==-1) &&
                 (agt.indexOf('compatible')==-1) && (agt.indexOf('opera')==-1)  &&
                 (agt.indexOf('webtv')==-1) && (agt.indexOf('hotjava')==-1)     &&
                 (Is.gecko) && (navigator.vendor=="Firebird"));
    Is.fx = ((agt.indexOf('mozilla/5')!=-1) && (agt.indexOf('spoofer')==-1) &&
                 (agt.indexOf('compatible')==-1) && (agt.indexOf('opera')==-1)  &&
                 (agt.indexOf('webtv')==-1) && (agt.indexOf('hotjava')==-1)     &&
                 (Is.gecko) && (navigator.vendor=="Firefox"));
    if ((Is.moz)||(Is.fb)||(Is.fx)) {  // 032504 - dmr
       Is.moz_ver = (navigator.vendorSub)?navigator.vendorSub:0;
       if(!(Is.moz_ver)) {
           Is.moz_ver = agt.indexOf('rv:');
           Is.moz_ver = agt.substring(Is.moz_ver+3);
           Is.paren   = Is.moz_ver.indexOf(')');
           Is.moz_ver = Is.moz_ver.substring(0,Is.paren);
       }
       Is.minor = Is.moz_ver;
       Is.major = parseInt(Is.moz_ver);
    }
   Is.fb_ver = Is.moz_ver;
   Is.fx_ver = Is.moz_ver;

    Is.nav  = ((agt.indexOf('mozilla')!=-1) && (agt.indexOf('spoofer')==-1)
                && (agt.indexOf('compatible') == -1) && (agt.indexOf('opera')==-1)
                && (agt.indexOf('webtv')==-1) && (agt.indexOf('hotjava')==-1)
                && (!Is.khtml) && (!(Is.moz)) && (!Is.fb) && (!Is.fx));

    // Netscape6 is mozilla/5 + Netscape6/6.0!!!
    // Mozilla/5.0 (Windows; U; Win98; en-US; m18) Gecko/20001108 Netscape6/6.0
    // Changed this to use navigator.vendor/vendorSub - dmr 060502   
    // var nav6Pos = agt.indexOf('netscape6');
    // if (nav6Pos !=-1) {
    if ((navigator.vendor)&&
        ((navigator.vendor=="Netscape6")||(navigator.vendor=="Netscape"))&&
        (Is.nav)) {
       Is.major = parseInt(navigator.vendorSub);
       // here we need Is.minor as a valid float for testing. We'll
       // revert to the actual content before printing the result. 
       Is.minor = parseFloat(navigator.vendorSub);
    }

    Is.nav2 = (Is.nav && (Is.major == 2));
    Is.nav3 = (Is.nav && (Is.major == 3));
    Is.nav4 = (Is.nav && (Is.major == 4));
    Is.nav4up = (Is.nav && Is.minor >= 4);  // changed to Is.minor for
                                                // consistency - dmr, 011001
    Is.navonly      = (Is.nav && ((agt.indexOf(";nav") != -1) ||
                          (agt.indexOf("; nav") != -1)) );

    Is.nav6   = (Is.nav && Is.major==6);    // new 010118 mhp
    Is.nav6up = (Is.nav && Is.minor >= 6); // new 010118 mhp

    Is.nav5   = (Is.nav && Is.major == 5 && !Is.nav6); // checked for ns6
    Is.nav5up = (Is.nav && Is.minor >= 5);

    Is.nav7   = (Is.nav && Is.major == 7);
    Is.nav7up = (Is.nav && Is.minor >= 7);

    Is.ie   = ((iePos!=-1) && (!Is.opera) && (!Is.khtml));
    Is.ie3  = (Is.ie && (Is.major < 4));

    Is.ie4   = (Is.ie && Is.major == 4);
    Is.ie4up = (Is.ie && Is.minor >= 4);
    Is.ie5   = (Is.ie && Is.major == 5);
    Is.ie5up = (Is.ie && Is.minor >= 5);
    
    Is.ie5_5  = (Is.ie && (agt.indexOf("msie 5.5") !=-1)); // 020128 new - abk
    Is.ie5_5up =(Is.ie && Is.minor >= 5.5);                // 020128 new - abk
	
    Is.ie6   = (Is.ie && Is.major == 6);
    Is.ie6up = (Is.ie && Is.minor >= 6);

// KNOWN BUG: On AOL4, returns false if IE3 is embedded browser
    // or if this is the first browser window opened.  Thus the
    // variables Is.aol, Is.aol3, and Is.aol4 aren't 100% reliable.

    Is.aol   = (agt.indexOf("aol") != -1);
    Is.aol3  = (Is.aol && Is.ie3);
    Is.aol4  = (Is.aol && Is.ie4);
    Is.aol5  = (agt.indexOf("aol 5") != -1);
    Is.aol6  = (agt.indexOf("aol 6") != -1);
    Is.aol7  = ((agt.indexOf("aol 7")!=-1) || (agt.indexOf("aol7")!=-1));
    Is.aol8  = ((agt.indexOf("aol 8")!=-1) || (agt.indexOf("aol8")!=-1));

    Is.webtv = (agt.indexOf("webtv") != -1);
    
    // new 020128 - abk
    
    Is.TVNavigator = ((agt.indexOf("navio") != -1) || (agt.indexOf("navio_aoltv") != -1)); 
    Is.AOLTV = Is.TVNavigator;

    Is.hotjava = (agt.indexOf("hotjava") != -1);
    Is.hotjava3 = (Is.hotjava && (Is.major == 3));
    Is.hotjava3up = (Is.hotjava && (Is.major >= 3));

    // end new
	
    // *** JAVASCRIPT VERSION CHECK ***
    // Useful to workaround Nav3 bug in which Nav3
    // loads <SCRIPT LANGUAGE="JavaScript1.2">.
    // updated 020131 by dragle
    Is.js;
    if (Is.nav2 || Is.ie3) Is.js = 1.0;
    else if (Is.nav3) Is.js = 1.1;
    else if ((Is.opera5)||(Is.opera6)) Is.js = 1.3; // 020214 - dmr
    else if (Is.opera7up) Is.js = 1.5; // 031010 - dmr
    else if (Is.khtml) Is.js = 1.5;   // 030110 - dmr
    else if (Is.opera) Is.js = 1.1;
    else if ((Is.nav4 && (Is.minor <= 4.05)) || Is.ie4) Is.js = 1.2;
    else if ((Is.nav4 && (Is.minor > 4.05)) || Is.ie5) Is.js = 1.3;
    else if (Is.nav5 && !(Is.nav6)) Is.js = 1.4;
    else if (Is.hotjava3up) Is.js = 1.4; // new 020128 - abk
    else if (Is.nav6up) Is.js = 1.5;

    // NOTE: In the future, update this code when newer versions of JS
    // are released. For now, we try to provide some upward compatibility
    // so that future versions of Nav and IE will show they are at
    // *least* JS 1.x capable. Always check for JS version compatibility
    // with > or >=.

    else if (Is.nav && (Is.major > 5)) Is.js = 1.4;
    else if (Is.ie && (Is.major > 5)) Is.js = 1.3;
    else if (Is.moz) Is.js = 1.5;
    else if (Is.fb||Is.fx) Is.js = 1.5; // 032504 - dmr
    
    // what about ie6 and ie6up for js version? abk
    
    // HACK: no idea for other browsers; always check for JS version 
    // with > or >=
    else Is.js = 0.0;
    // HACK FOR IE5 MAC = js vers = 1.4 (if put inside if/else jumps out at 1.3)
    if ((agt.indexOf("mac")!=-1) && Is.ie5up) Is.js = 1.4; // 020128 - abk
    
    // Done with Is.minor testing; revert to real for N6/7
    if (Is.nav6up) {
       Is.minor = navigator.vendorSub;
    }

    // *** PLATFORM ***
    Is.win   = ( (agt.indexOf("win")!=-1) || (agt.indexOf("16bit")!=-1) );
    // NOTE: On Opera 3.0, the userAgent string includes "Windows 95/NT4" on all
    //        Win32, so you can't distinguish between Win95 and WinNT.
    Is.win95 = ((agt.indexOf("win95")!=-1) || (agt.indexOf("windows 95")!=-1));

    // is this a 16 bit compiled version?
    Is.win16 = ((agt.indexOf("win16")!=-1) ||
               (agt.indexOf("16bit")!=-1) || (agt.indexOf("windows 3.1")!=-1) ||
               (agt.indexOf("windows 16-bit")!=-1) );

    Is.win31 = ((agt.indexOf("windows 3.1")!=-1) || (agt.indexOf("win16")!=-1) ||
                    (agt.indexOf("windows 16-bit")!=-1));
	
	Is.winme = ((agt.indexOf("win 9x 4.90")!=-1));    // new 020128 - abk
    Is.win2k = ((agt.indexOf("windows nt 5.0")!=-1) || (agt.indexOf("windows 2000")!=-1)); // 020214 - dmr
    Is.winxp = ((agt.indexOf("windows nt 5.1")!=-1) || (agt.indexOf("windows xp")!=-1)); // 020214 - dmr

    // NOTE: Reliable detection of Win98 may not be possible. It appears that:
    //       - On Nav 4.x and before you'll get plain "Windows" in userAgent.
    //       - On Mercury client, the 32-bit version will return "Win98", but
    //         the 16-bit version running on Win98 will still return "Win95".
    Is.win98 = ((agt.indexOf("win98")!=-1) || (agt.indexOf("windows 98")!=-1));
    Is.winnt = ((agt.indexOf("winnt")!=-1) || (agt.indexOf("windows nt")!=-1));
    Is.win32 = (Is.win95 || Is.winnt || Is.win98 ||
                    ((Is.major >= 4) && (navigator.platform == "Win32")) ||
                    (agt.indexOf("win32")!=-1) || (agt.indexOf("32bit")!=-1));

    Is.os2   = ((agt.indexOf("os/2")!=-1) ||
                    (navigator.appVersion.indexOf("OS/2")!=-1) ||
                    (agt.indexOf("ibm-webexplorer")!=-1));

    Is.mac    = (agt.indexOf("mac")!=-1);
    if (Is.mac) { Is.win = !Is.mac; } // dmr - 06/20/2002
    Is.mac68k = (Is.mac && ((agt.indexOf("68k")!=-1) ||
                               (agt.indexOf("68000")!=-1)));
    Is.macppc = (Is.mac && ((agt.indexOf("ppc")!=-1) ||
                                (agt.indexOf("powerpc")!=-1)));

    Is.sun   = (agt.indexOf("sunos")!=-1);
    Is.sun4  = (agt.indexOf("sunos 4")!=-1);
    Is.sun5  = (agt.indexOf("sunos 5")!=-1);
    Is.suni86= (Is.sun && (agt.indexOf("i86")!=-1));
    Is.irix  = (agt.indexOf("irix") !=-1);    // SGI
    Is.irix5 = (agt.indexOf("irix 5") !=-1);
    Is.irix6 = ((agt.indexOf("irix 6") !=-1) || (agt.indexOf("irix6") !=-1));
    Is.hpux  = (agt.indexOf("hp-ux")!=-1);
    Is.hpux9 = (Is.hpux && (agt.indexOf("09.")!=-1));
    Is.hpux10= (Is.hpux && (agt.indexOf("10.")!=-1));
    Is.aix   = (agt.indexOf("aix") !=-1);      // IBM
    Is.aix1  = (agt.indexOf("aix 1") !=-1);
    Is.aix2  = (agt.indexOf("aix 2") !=-1);
    Is.aix3  = (agt.indexOf("aix 3") !=-1);
    Is.aix4  = (agt.indexOf("aix 4") !=-1);
    Is.linux = (agt.indexOf("inux")!=-1);
    Is.sco   = (agt.indexOf("sco")!=-1) || (agt.indexOf("unix_sv")!=-1);
    Is.unixware = (agt.indexOf("unix_system_v")!=-1);
    Is.mpras    = (agt.indexOf("ncr")!=-1);
    Is.reliant  = (agt.indexOf("reliantunix")!=-1);
    Is.dec   = ((agt.indexOf("dec")!=-1) || (agt.indexOf("osf1")!=-1) ||
           (agt.indexOf("dec_alpha")!=-1) || (agt.indexOf("alphaserver")!=-1) ||
           (agt.indexOf("ultrix")!=-1) || (agt.indexOf("alphastation")!=-1));
    Is.sinix = (agt.indexOf("sinix")!=-1);
    Is.freebsd = (agt.indexOf("freebsd")!=-1);
    Is.bsd = (agt.indexOf("bsd")!=-1);
    Is.unix  = ((agt.indexOf("x11")!=-1) || Is.sun || Is.irix || Is.hpux ||
                 Is.sco ||Is.unixware || Is.mpras || Is.reliant ||
                 Is.dec || Is.sinix || Is.aix || Is.linux || Is.bsd || Is.freebsd);

    Is.vms   = ((agt.indexOf("vax")!=-1) || (agt.indexOf("openvms")!=-1));
// additional checks, abk
	Is.anchors = (document.anchors) ? "true":"false";
	Is.regexp = (window.RegExp) ? "true":"false";
	Is.option = (window.Option) ? "true":"false";
	Is.all = (document.all) ? "true":"false";
// cookies - 990624 - abk
	document.cookie = "cookies=true";
	Is.cookie = (document.cookie) ? "true" : "false";
	Is.images = (document.images) ? "true":"false";
	Is.layers = (document.layers) ? "true":"false"; // gecko m7 bug?
// new doc obj tests 990624-abk
	Is.forms = (document.forms) ? "true" : "false";
	Is.links = (document.links) ? "true" : "false";
	Is.frames = (window.frames) ? "true" : "false";
	Is.screen = (window.screen) ? "true" : "false";

// java
	Is.java = (navigator.javaEnabled());

// Flash checking code adapted from Doc JavaScript information; 
// see http://webref.com/js/column84/2.html

   Is.Flash        = false;
   Is.FlashVersion = 0;

   if ((Is.nav||Is.opera||Is.moz||Is.fb||Is.fx)||(Is.mac&&Is.ie5up)) {
      var plugin = (navigator.mimeTypes && 
                    navigator.mimeTypes["application/x-shockwave-flash"] &&
                    navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin) ?
                    navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin : 0;
      if (plugin&&plugin.description) {
         Is.Flash = true;
         Is.FlashVersion = parseInt(plugin.description.substring(plugin.description.indexOf(".")-1));
      }
   }

   if (Is.win && Is.ie4up) {
		for(var i=10; i>0; i--) {
				try {
					var flash = new ActiveXObject("ShockwaveFlash.ShockwaveFlash." + i);
					Is.Flash = true;
					Is.FlashVersion = i;
					break;
				} catch(e) { }
		}
	}
	Is.flash = Is.Flash;
	return;
})();
function getAttribute(elem, name, sensitive) {
	if(sensitive === undefined) {
		sensitive = false;
	}
	if (elem == null || name == null)
		return;
	for(var x=0; x<elem.attributes.length; x++) {
		var attName = ((sensitive)?
					elem.attributes[x].nodeName.toString():
					elem.attributes[x].nodeName.toLowerCase());
		var match = ((sensitive)?
					name.toString():
					name.toLowerCase());
		if( attName == match ) {
			return elem.attributes[x].nodeValue;
		}
	}		
}

function setAttribute(elem,name,value){
	if (elem == null || name == null)
		return
    var x=0;
	for(; x < elem.attributes.length; x++ ) {
		var attName = elem.attributes[x].nodeName.toLowerCase();
		if( attName == name.toLowerCase() ) {
			elem.attributes[x].nodeValue = value;
			return;
		}
	}	
	//Is there a way to add an attribute	
	elem.attributes[x].nodeName = name;
	elem.attributes[x].nodeValue = value;
}

function getText(elem)
{	if (elem == null)
		return ''
	if (elem.childNodes.length > 1) {
		if(elem.childNodes[1].firstChild) {
			return elem.childNodes[1].firstChild.nodeValue
		} else if (elem.firstChild) {
			return elem.firstChild.nodeValue
		}
    } else if (elem.firstChild) {
        return elem.firstChild.nodeValue 		
    } else { 
    	return ''
    }
}


function importXML(url, handler) {

	if(typeof handler != 'function') {
		
		handler = window[handler]
	}

	url += ((url.indexOf('?') == -1) ? '?' : '&') + '__t=' + (new Date()).getTime();

	var ajax = new Ajax.Request(
		url, {
			method: 'get',
			onComplete: function(req) {
				handler(req.responseXML);
			},
			onFailure: function(transport, json) {
			}
		});
}
function postSavedBudget(url, params, handler) {

	if(typeof handler != 'function') {
		
		handler = window[handler]
	}

	url += ((url.indexOf('?') == -1) ? '?' : '&') + '__t=' + (new Date()).getTime();

	var ajax = new Ajax.Request(
		url, {
			method: 'post',
			parameters: params,
			onComplete: function(req) {
				handler(req.responseXML);
			},
			onFailure: function(transport, json) {
			}
		});
}

function importDWRXML(url, id, handler) {

	if(typeof handler != 'function') {
		handler = window[handler]
	}
	
	url += ((url.indexOf('?') == -1) ? '?' : '&') + '__t=' + (new Date()).getTime();
	var ajax = new Ajax.Request(
		url, {
			method: 'get',
			onComplete: function(req) {
				handler(id, req.responseXML);
			},
			onFailure: function(transport, json) {
			}
		});
}

function importText(url, handler) {

	if(typeof handler != 'function') {
		handler = window[handler]
	}
	
	url += ((url.indexOf('?') == -1) ? '?' : '&') + '__t=' + (new Date()).getTime();
	var ajax = new Ajax.Request(
		url, {
			method: 'get',
			onComplete: function(req) {
				handler(req.responseText);
			},
			onFailure: function(transport, json) {
        		handler("");
			}
		});
}

function postXML(url, params, handler) {

	if(typeof handler != 'function') {
		handler = window[handler]
	}
	var myAjax = new Ajax.Request( url, {
			method: 'post',
			parameters: params,
			onComplete: function(req) {
				handler(req.responseXML);
			}
		});
}


function doNothing() { return true; }

/* Global Environment Variables ------------------*/
/**************************************************/
var Env = {
    cacheServer : staticServer,
    debug : true,
    print : printfire
}
function printfire() {
    if (document.createEvent) {
        printfire.args = arguments;
        var ev = document.createEvent("Events");
        ev.initEvent("printfire", false, true);
        if(window.dispatchEvent) //avoid Opera bug
            dispatchEvent(ev);
    }
}
/*************************************Environment**/

/* Add a couple aliases used with Array ----------*/
/**************************************************/
Array.prototype.prepend = Array.prototype.unshift;
Array.prototype.append = Array.prototype.push;
Array.prototype.contains = Array.prototype.include;
/******************************************Arrays**/



/* Extend the String prototype (instance methods) */
/*------------------------------------------------
    boolean obj.isNumeric()
    boolean obj.isWhiteSpace()
    String  obj.escape()
    String  obj.trim()
    String  obj.getNoWrap()
--------------------------------------------------*/
/**************************************************/
Object.extend(String.prototype, {
    isNumeric : function() {
        for(var i=0; i<this.length; i++) {
            if(('0123456789.').indexOf(this.charAt(i)) == -1) {
                return false;
            }
        }
        return true;
    },
    escape : function() {
        return escape(this);
    },
    deQuote : function() {
        return this.replace('\'', '\\\'')
    },
    isWhiteSpace : function() {
        for (var i=0; i<this.length; i++)
            if ((' \t\n\r').indexOf(this.charAt(i)) == -1)
                return false;
        return true;
    },
    trim : function() {
        return (/\s*(\S*(\s*\S)*)\s*/).exec(this)[1];
        /*
        var trimmed = this;
        var ch = trimmed.substring(0, 1);
        while (ch.isWhiteSpace() && trimmed.length > 0) {
            trimmed = trimmed.substring(1, trimmed.length);
            ch = trimmed.substring(0, 1);
        }
        ch = trimmed.substring(trimmed.length-1, trimmed.length);
        while (ch.isWhiteSpace() && trimmed.length > 0) {
            trimmed = trimmed.substring(0, trimmed.length-1);
            ch = trimmed.substring(trimmed.length-1, trimmed.length);
        }
        return trimmed;
        */
    },
    getNoWrap : function() {
        var noWrap = '';
        var inTag = false;
        for(var i=0; i<this.length; i++) {
            var c = this.charAt(i);
            if(c == '<') inTag = true;
            if(c == '>') nTag = false;
            if(!inTag && c.isWhiteSpace())
                noWrap += '&nbsp;';
            else
                noWrap += c;
        }
        return noWrap;
    }
});
/*****************************************Strings**/



Object.extend(Object, {
    generateId : function () {
        return '__unq__' + parseInt((new Date()).getTime().toString() + Math.round(Math.random()*1000000), 10).toString(32);
    }
});



/* Effects object : visual tasks (static methods) */
/*------------------------------------------------
    void Effects.fadeIn(elem, interval, callback)
    void Effects.fadeOut(elem, interval, callback)
    void Effects.imageRollover(elem, normal, hover, down)
    void Effects.classRollover(elem, normal, hover, down)
--------------------------------------------------*/
/**************************************************/
var Effects = new Object();
Object.extend(Effects, {
    fadeIn : function(elem, interval, callback) {
        callback = callback || Prototype.emptyFunction;
        elem = $(elem);
        if(Is.ie) {
            elem.style.display = 'block';
            elem.style.visibility = 'visible';
            return callback();
        }
        elem.style.opacity = 0.0;
        elem.style.display = 'block';
        elem.style.visibility = 'visible';
        this._fadeIn(elem, interval, callback);
    },
    _fadeIn : function(elem, interval, callback) {
        elem = $(elem);
        if(parseFloat(elem.style.opacity) + interval >= 1.0) {
            elem.style.opacity = 1.0;
            return callback();
        }
        elem.style.opacity = parseFloat(elem.style.opacity) + interval;
        setTimeout(function() { Effects._fadeIn(elem, interval, callback); }, 30);
    },
    fadeOut : function(elem, interval, callback) {
        callback = callback || Prototype.emptyFunction;
        elem = $(elem);
        if(Is.ie) {
            elem.style.visibility = 'hidden';
            elem.style.display = 'none';
            return callback();
        }
        elem.style.opacity = 1.0;
        this._fadeOut(elem, interval, callback);
    },
    _fadeOut : function(elem, interval, callback) {
        elem = $(elem);
        if(parseFloat(elem.style.opacity) + interval <= 0.0) {
            elem.style.opacity = 0.0;
            elem.style.visibility = 'hidden';
            elem.style.display = 'none';
            return callback();
        }
        elem.style.opacity = parseFloat(elem.style.opacity) + interval;
        setTimeout(function() { Effects._fadeOut(elem, interval, callback); }, 30);
    },
    imageRollover : function(id, normal, hover, down) {
        var elem = $(id);
        if(elem == null)
            return;
        elem.img_normal = new Image();
        elem.img_hover = new Image();
        elem.img_down = new Image();

        elem.img_normal.src = normal;
        elem.img_hover.src = hover;
        elem.img_down.src = down;

        elem.mouseover = function(){ this.src = this.img_hover.src; };
        elem.mouseup = function(){ this.src = this.img_hover.src; };
        elem.mousedown = function(){ this.src = this.img_down.src; };
        elem.mouseout = function(){ this.src = this.img_normal.src; };

        Event.observe(elem, 'mouseover', elem.mouseover.bindAsEventListener(elem));
        Event.observe(elem, 'mouseup', elem.mouseup.bindAsEventListener(elem));
        Event.observe(elem, 'mousedown', elem.mousedown.bindAsEventListener(elem));
        Event.observe(elem, 'mouseout', elem.mouseout.bindAsEventListener(elem));

        elem.src = elem.img_normal.src;
    },
    classRollover : function(id, normal, hover, down) {
        var elem = $(id);
        if(elem == null)
            return;
        Event.observe(elem, 'mouseover', (function() {
                Element.removeClassName(id, normal);
                Element.removeClassName(id, down);
                Element.addClassName(id, hover);
            }).bindAsEventListener(elem));
        Event.observe(elem, 'mouseup', (function() {
                Element.removeClassName(id, normal);
                Element.removeClassName(id, down);
                Element.addClassName(id, hover);
            }).bindAsEventListener(elem));
        Event.observe(elem, 'mouseout', (function() {
                Element.removeClassName(id, hover);
                Element.removeClassName(id, down);
                Element.addClassName(id, normal);
            }).bindAsEventListener(elem));
        Event.observe(elem, 'mousedown', (function() {
                Element.removeClassName(id, normal);
                Element.removeClassName(id, hover);
                Element.addClassName(id, down);
            }).bindAsEventListener(elem));
        Element.addClassName(id, normal);
    }
});
/*****************************************Effects**/


// tqr_shortRegBmon_onchange() requires "/jsp/js/calendarUtils.js"
function tqr_shortRegBmon_onchange (iMonth, dSelect) {
    var YEAR = 2004; 									// Leap year
    var s = $(dSelect);			// s
    if (iMonth === 0) {
        s.selectedIndex  = 0;
        s.options.length = 1;
        return;
    }
    syncDaysWithMonth (iMonth, YEAR, dSelect);
}


/* Page Utilities eg: ready handlers  ------------*/
/**************************************************/
var Page = {
    readyHandlers : new Array(),
    readyHandlersTail : new Array(),
    addReadyHandler : function(func) {
        this.readyHandlers.append(func);
    },
    addReadyHandlerToTail : function(func) {
        this.readyHandlersTail.prepend(func);
    },
    runReadyHandlers : function() {
        this.readyHandlers.each(function(item){item(); });
        this.readyHandlersTail.each(function(item){ item(); });
    }
};

var addBodyOnloadHandler = Page.addReadyHandler.bind(Page);
var runBodyOnloadHandlers = Page.runReadyHandlers.bind(Page);

Page.QueryString = new Object();
Object.extend(Page.QueryString, {
    params : null,
    initialize : function() {
        this.params = {};
        qs = location.search.substring(1,location.search.length);
        if(qs.length == 0)
            return;

        qs = qs.replace(/\+/g, ' ');
        var args = qs.split('&');
        // split out each name=value pair
        for (var i=0; i<args.length; i++) {
            var value;
            var pair = args[i].split('=');
            var name = unescape(pair[0]);

            if (pair.length == 2) {
                value = unescape(pair[1]);
            } else {
                value = name;
            }

            this.params[name] = value;
        }
    },
    get : function(key, _default) {
        _default = _default || null;
        var value = this.params[key];
        if (value == null)
            value = _default;

        return value;
    }
});
Page.QueryString.initialize();

//because this relies on the initializers of other things having been run already
Page.addReadyHandlerToTail(
    function() {
        var previewProductId = Page.QueryString.get('productId');
        var referrer = document.referrer==null?"":document.referrer;
        if(previewProductId != null) {
            if(window.pv_showProductById && referrer.indexOf("productId")==-1) {
            	if (location.href.indexOf("servlet/widgets") < 0 &&
            		location.href.indexOf("Product") < 0) {
            		pv_showProductById(previewProductId);
            	}
            }
        }
    }
);





function setUpDefaultTextInput(elem, defaultText) {
    var elem = $(elem);
    try {
        elem.onfocus = function() {
            if(this.value == defaultText) {
                this.value = '';
            }
        };
        elem.onblur = function() {
            if(this.value == '') {
                this.value = defaultText;
            }
        };
    } catch (e) {}
}
/********************************************Page**/




/**************************************************/
/* functions for working with html SELECT objects */
function getSelectedValue(elem) {
    elem = $(elem);
    if(elem.options == null || elem.options.length == 0)
        return '';
    return elem.options[elem.selectedIndex].value;
}
function getSelectedValues(elem){
	elem=$(elem)
    if(elem.options == null || elem.options.length == 0)
        return '';

    var selectedelms=new Array()
    var j=0;
    for(i=0;i<elem.options.length;i++)
    {

    	if(elem.options[i].selected)
    	{
    		selectedelms[j]=elem.options[i];
    		j++;
    	}
    }
    return selectedelms;
}
function getSelectedLabel(elem) {
    elem = $(elem);
    if(elem.options == null || elem.options.length == 0)
        return '';
    try {
        return getText(elem.options[elem.selectedIndex]);
    } catch (e) { return ''; }
}
function appendToSelect(select, value, content) {
    select = $(select);
    var i=select.options.length;
    select.options[i]=new Option(content,value);
}
function clearSelect(select) {
    var select = $(select)
    while (select.length > 0) {
        select.remove(0)
    }
}
function selectItemByValue(elem, value) {
    elem = $(elem);
    for(var i=0; i<elem.options.length; i++) {
        if(elem.options[i].value == value) {
            return elem.selectedIndex = i
        }
    }
}

function buildDropDown(xmlDoc, elem, preselectValue) {
    var selects = xmlDoc.getElementsByTagName('pairs');
    var items = xmlDoc.getElementsByTagName('pair');

    clearSelect(elem);

    // loop through <option> elements, and add each nested
    for (var i = 0; i < items.length; i++) {
        var toAppend = getText(items[i]);
        var optionValue = getAttribute(items[i], 'value');
        appendToSelect(elem, optionValue, toAppend);

        //if marked as selected then put in drop-downs
        var selected = getAttribute(items[i], 'selected');
        if (selected) elem.selectedIndex = i;
    }
    selectItemByValue(elem, preselectValue);
}
/*____________________________________________________*/




function numbersonly(myfield, e) {
    var key;
    var keychar;
    if (window.event)
        key = window.event.keyCode;
    else if (e)
        key = e.which;
    else
        return true;
    keychar = String.fromCharCode(key);
    // control keys
    if ((key==null) || (key==0) || (key==8) ||
     (key==9) || (key==13) || (key==27) )
        return true;
    // numbers
    else if ((("0123456789").indexOf(keychar) > -1))
        return true;
    else
        return false;
}

function enterDefault(obj, text) {
    if (obj.value == text)
        obj.value = '';
}

function replaceDefault(obj, text) {
    if (obj.value == '')
        obj.value = text;
}










//there MUST be one showAllSelects() for every hideAllSelects() call made
//If you do 3 hides, and 1 show, it will not show
//this only finally showsAllSelects when the number of hide's() equals the number of show's()
var hide_selects_wait = 0
var popUpParent = null
var popUp = null
function hideAllSelects(divId) {
    if(hide_selects_wait < 0) {
        hide_selects_wait = 0
    }
    hide_selects_wait++
    var selects = document.getElementsByTagName('select')
    for(var i=0; i<selects.length; i++) {
        var parentObj
        var elem = selects[i]
        if(divId) {
            var found = false
            while( (parentObj = elem.parentNode) ) {
                elem = parentObj
                if(parentObj.id == divId) {
                    found = true
                    break
                }
            }
            if(! found) {
                selects[i].style.visibility = 'hidden'
            }
        } else {
            selects[i].style.visibility = 'hidden'
        }
    }
    var iframes = document.getElementsByTagName('iframe')
    for(var i=0; i<iframes.length; i++)
        iframes[i].style.visibility = 'hidden'
}

function showAllSelects() {
    hide_selects_wait--
    if(hide_selects_wait < 0) {
        hide_selects_wait = 0
    }
    if(hide_selects_wait > 0) {
        return
    }
    var selects = document.getElementsByTagName('select')
    for(var i=0; i<selects.length; i++)
        selects[i].style.visibility = 'visible'
    var iframes = document.getElementsByTagName('iframe')
    for(var i=0; i<iframes.length; i++)
        iframes[i].style.visibility = 'visible'
}



function getKeyCode(e) {
    if( !e ) {
        if( window.event ) {
            e = window.event
        } else {
            return false
        }
    }
    var keyCode = false
    if( typeof( e.which ) == 'number' ) {
        //NS 4, NS 6+, Mozilla 0.9+, Opera
        keyCode = e.which;
    } else if( typeof( e.keyCode ) == 'number'  ) {
        //IE, NS 6+, Mozilla 0.9+
        keyCode = e.keyCode;
    } else if( typeof( e.charCode ) == 'number'  ) {
        //also NS 6+, Mozilla 0.9+
        keyCode = e.charCode;
    }
    return keyCode
}


function getTopLeft(obj) {
    return {
        x : findPosX(obj),
        y : findPosY(obj)
    }
}


function findPosX(obj) {
    var curleft = 0
    if (obj.offsetParent) {
        while (obj.offsetParent) {
            curleft += obj.offsetLeft
            obj = obj.offsetParent
        }
    }
    else if (obj.x)
        curleft += obj.x
    return curleft
}

function findPosY(obj) {
    var curtop = 0
    if (obj.offsetParent) {
        while (obj.offsetParent) {
            curtop += obj.offsetTop
            obj = obj.offsetParent
        }
    }
    else if (obj.y)
        curtop += obj.y
    return curtop;
}


function getTop() {
    var position
    if (window.innerHeight)	{
        position = window.pageYOffset
    }
    else if (document.documentElement && document.documentElement.scrollTop) {
        position = document.documentElement.scrollTop
    }
    else if (document.body) {
        position = document.body.scrollTop
    }
    return position
}


function getWindowDimensions() {
    var x,y
    if (self.innerHeight) { // all except Explorer
        x = self.innerWidth
        y = self.innerHeight
    }
    else if (document.documentElement && document.documentElement.clientHeight) {
        // Explorer 6 Strict Mode
        x = document.documentElement.clientWidth
        y = document.documentElement.clientHeight
    }
    else if (document.body) { // other Explorers
        x = document.body.clientWidth
        y = document.body.clientHeight
    }
    return {
        x : x,
        y : y
    }
}




function readableFormat(num) {
    var sep = ','
    var decpoint = '.'

    num = num.toString()
    var a = num.split(decpoint)
    var x = a[0]
    var y = a[1]
    var z = ''

    if (typeof(x) != 'undefined') {
        // reverse the digits. regexp works from left to right.
        for (i=x.length-1; i>=0; i--)
            z += x.charAt(i);

        // add seperators. but undo the trailing one, if there
        z = z.replace(/(\d{3})/g, "$1" + sep)
        if (z.slice(-sep.length) == sep)
            z = z.slice(0, -sep.length)

        // reverse again to get back the number
        x = ''
        for (i=z.length-1; i>=0; i--)
            x += z.charAt(i)

        // add the fraction back in, if it was there
        if (typeof(y) != "undefined" && y.length > 0)
            x += decpoint + y
    }
    return x
}



function setUpPageSearch(arr) {
    addBodyOnloadHandler(function() {
        Event.observe($('pageSearch'), 'click', showNewSearchBox(arr), false);
    });
}

function showNewSearchBox(arr) {
    var bg = new Image()
    bg.src = staticServer+'/images/header/search_popup_bg.png'
    var html = ''
    html += '<div style="background:url("+staticServer+"/images/header/search_popup_bg.png) no-repeat top left;'
    html += 'width:166px;height:72px;">'
    html +=		'<div style="padding-top:16px;text-align:left;padding-left:10px;">' +
                '<form action="/jsp/search/index.jsp" method="get"><input name="keyword" type="text" id="pageKeyword" /><br />' +
                '<div id="pageSearchCatsDiv"><select name="category" id="pageSearchCats"><option value="0">All Products</option>\r\n';
    for(var i=0; i<arr.length-1; i++) {
        html += '<option value="'+arr[i].id+'">' + arr[i].name + '</option>\r\n';
    }
    html += '</select></div><input type="image" src=staticServer+"/images/header/go.gif" style="float:right;margin:6px 7px 0 0;" />' +
            '</form></div></div>';

    return function () {
        SimplePopup.clear();
        SimplePopup.setContents(html);
        SimplePopup.setPosition('pageSearchPrompt');
        var Focuser = {
            attempts : 0,
            timer : null,
            doFocus : function() {
                try {
                    $('pageKeyword').focus();
                    if(is_ie && ++ this.attempts < 3) {
                        //ie has problems focusing this element for some reason.
                        //so I try a couple times before stopping.
                        setTimeout(this.doFocus.bind(Focuser), 100);
                    } else {
                        this.attempts = 0;
                    }
                } catch (e) { /*if they have closed the popup, the element doesnt exist*/ }
            }
        };
        SimplePopup.show(Focuser.doFocus.bind(Focuser), false); //no iframe in IE
    }
}


function showSearchBox(arr) {
    var bg = new Image()
    bg.src = staticServer+'/images/header/search_popup_bg.png'
    var html = ''
    html += '<div style="background:url("+staticServer+"/images/header/search_popup_bg.png) no-repeat top left;'
    html += 'width:166px;height:72px;">'
    html +=		'<div style="padding-top:16px;text-align:left;padding-left:10px;">' +
                '<form action="/jsp/MyPersonalShopper/MyWishList" method="get"><input name="keyword" type="text" id="pageKeyword" /><br />' +
                '<div id="pageSearchCatsDiv"><select name="aspect" id="pageSearchCats"><option value="">All Products</option>\r\n';
    for(var i=0; i<arr.length-1; i++) {
        html += '<option value="_A*interest_zone_*' + arr[i].id + '">' + arr[i].name + '</option>\r\n';
    }
    html += '</select></div><input type="image" src=staticServer+"/images/header/go.gif" style="float:right;margin:6px 7px 0 0;" />' +
            '</form><br clear="all" /></div></div>';

    return function () {
        SimplePopup.clear();
        SimplePopup.setContents(html);
        SimplePopup.setPosition('pageSearchPrompt');
        var Focuser = {
            attempts : 0,
            timer : null,
            doFocus : function() {
                try {
                    $('pageKeyword').focus();
                    if(Is.ie && ++ this.attempts < 3) {
                        //ie has problems focusing this element for some reason.
                        //so I try a couple times before stopping.
                        setTimeout(this.doFocus.bind(Focuser), 100);
                    } else {
                        this.attempts = 0;
                    }
                } catch (e) { /*if they have closed the popup, the element doesnt exist*/ }
            }
        };
        SimplePopup.show(Focuser.doFocus.bind(Focuser), false); //no iframe in IE
    }
}


function tqr_SaveLinkOff() {}
function tqr_SaveLinkOn() {}

function clearIfHas(obj,value) {
    if(obj.value == value) {
        obj.value = ''
        obj.defaultValue = value
        obj.onblur = function() {
            if(this.value == '') {
                this.value = this.defaultValue
            }
        }
    }
}

//objectRegistry provides a simple way for objects to create string references to their own methods. That is,
//an object can register itself and then refer to itself as objectRegistry.get(id), where id is the number returned
//by the register method. This is useful when an object needs to write out a javascript link that calls its method.

var objectRegistry = new Object()
objectRegistry.listing = {}
objectRegistry.index = 0

objectRegistry.register = function (toRegister) {
    this.listing[this.index] = toRegister
    this.index++
    return this.index-1
}

objectRegistry.get = function (searchString) {
    return this.listing[searchString]
}

objectRegistry.run = function (fn, onWhat) {
    var k = 0
    var currentObj = this.listing[k]
    while (currentObj!=null) {
        if (!onWhat || (currentObj.type && currentObj.type==onWhat)) {
            fn.bind(currentObj)()
        }
        k++
        currentObj = this.listing[k]
    }
}


//This is a function that allows bodyOnloadHandlers to be run if it's too late to add an on-load handler.
var alreadyRunOnloadHandlers = false
addBodyOnloadHandler(function() {alreadyRunOnloadHandlers = true})
function addBodyOnloadHandlerOrRun(fn) {
    if (alreadyRunOnloadHandlers) fn()
    else addBodyOnloadHandler(fn)
}

//These allow easy manipulation of strings that need to be written out and then read by javascript
function addslashes(str) {
    str=str.replace(/\\/g,'\\\\');
    str=str.replace(/\'/g,'\\\'');
    str=str.replace(/\"/g,'\\"');
    str=str.replace(/\0/g,'\\0');
    str=str.replace(/&#39;/g,'\\\'')
    return str;
}
function stripslashes(str) {
    str=str.replace(/\\'/g,'\'');
    str=str.replace(/\\"/g,'"');
    str=str.replace(/\\0/g,'\0');
    str=str.replace(/\\\\/g,'\\');
    return str;
}

function toggleVisibility(target) {
	if (target.style.display == 'none') target.style.display = 'inline'
	else target.style.display = 'none'
}


function popup(mylink, windowname,width,height)
{

if (! window.focus)return true;
var href;
if (typeof(mylink) == 'string')
   href=mylink;
else
   href=mylink.href;

window.open(href, windowname, 'width='+width+',height='+height+',scrollbars=yes');
return false;
}






function ReturnURLManager()
{


	this.determineReturnURL=function()
	{

		var returnURL=window.location.href;
		if(returnURL.indexOf('?')==-1)
			returnURL+='?';
		var extraParams=this.determineExtraParams();
		returnURL+=extraParams;
		$('hiddenReturnURL').value=returnURL;
	}

	this.determineCheckoutReturnURL=function()
	{

		var returnURL=window.location.href;
		if(returnURL.indexOf('?')==-1)
			returnURL+='?';
		var extraParams=this.determineExtraParams();
		returnURL+=extraParams;
		$('checkoutReturnURL').value=returnURL;
	}

	this.determineExtraParams=function()
	{
		var extraParams=""
		extraParams+=this.checkProductPopup();
		extraParams+=this.checkSavedPopup();
		return extraParams;
	}

	this.checkProductPopup=function()
	{
		var popup=$('productDetailProductId');
		if(popup!=null && popup.innerHTML!=null)
			return "&productId="+popup.innerHTML;
		return "";
	}

	this.checkSavedPopup=function()
	{


		var popup=$('savedPopupProductId');
		if(popup!=null && popup.innerHTML!=null)
			return "&savedId="+popup.innerHTML;
		return "";
	}

}

var returnURLManager=new ReturnURLManager()
/***************
  inputValidator.js
  
  A utility file for encapsulating logic to 
  verify user input on edit & add user forms.<b> 

  Functions:
    validateRecipientInfo
    calculateBirthYear
    validateBirthDate
    
****************/


/************************
  validateRecipientInfo
  
  Validates the text from the edit/add user/recipient forms.
  
  Parameters:
    nickname:  String
    genderSelected:  Boolean
    relationship:  Integer
    age, month, day:  String
    
  Returns:
    true if entries, false otherwise
************************/
function validateRecipientInfo( nickname, 
                                genderSelected, 
    							relationship, 
    							age, month, day){
                     
    var str = '';

    //nickname is required
    if (nickname == null || nickname.length == 0)
      str += "Nickname is required.\n";
      
    //gender is required
    if (!genderSelected)
      str += "Gender selection is required for " + nickname + ".\n";

    //relationship
    if (relationship == 0)
      str += "Relationship is required for " + nickname + ".\n";

    //age
    if (age == null || age.length == 0)
      str += "Age is required for " + nickname + ".\n";

    //age must be an integer
    else if (isNaN(age) || parseInt(age) < 0)
      str += "Age for " + nickname + " must be a non-negative number.\n";
    
    else if (parseInt(age)>115)
      str+="You entered an age of " + age + " for " + nickname + ". Age must be lower than 115 years.";

    //birthMonth
    if (month == 0)
      str += "Birth Month is required for " + nickname + ".\n";

    //birthDay
    if (day == 0)
      str += "Birth Day is required for " + nickname + ".\n";

    if( str != '' ){
      alert(str);
      return false;
    }
     
    return true;
}


/************************
  validateBirthDate
  
  Given the age, birth month and birth day, 
  determines whether or not this is a valid
  combination.
  
  Uses calculateBirthYear.

  Parameters:
    intMonth, intDay, intAge:	Integers
    
  Returns:
    true if month/day/age is valid, false otherwise
************************/
function validateBirthDate( intMonth, intDay, intAge ){

  var intYear = calculateBirthYear( intAge, intMonth, intDay );
  return validateBirthDateYear( intMonth, intDay, intYear );

}

// validateBirthDateYear() requires "/jsp/js/calendarUtils.js"
function validateBirthDateYear( intMonth, intDay, intYear ) {

	var MIN_MONTH = 1;
	var MAX_MONTH = 12;
	var MIN_DAY   = 1;
	var MAX_YEAR  = (new Date()).getFullYear();
  	var MIN_YEAR  = MAX_YEAR - 115;
	
 	// Check for valid month
 	if (intMonth < MIN_MONTH || intMonth > MAX_MONTH) {
	    alert("The month specified for birthday is not valid.");
	    return false;
 	}
      
	// Check for valid year
	if (intYear < MIN_YEAR || intYear > MAX_YEAR) {
	  	alert("The year specified for birthday is not valid.");
	    return false;
	}
	
	// Check for valid day
	if (intDay < MIN_DAY || intDay > getDaysInMonth(intMonth, intYear)) {
		alert("The day specified for birthday is not valid.");
	    return false;
	}
	
	return true;
}



/************************
  calculateBirthYear
  
  Calculates the birth year of user or recipient
  given the person's age, birth month and birth day.
  
  Called by validateBirthDate( month, day, age )

  Parameters:
    intAge, intMonth, intDay:	Integers
    
  Returns:
    intYear:  Integer
************************/
function calculateBirthYear( intAge, intMonth, intDay ){

  var date = new Date();
  var curYear = date.getFullYear();
  var curMonth = date.getMonth()+1;
  var curDay = date.getDate();
	  
  var birthYear = curYear - intAge;

  if (curMonth < intMonth || ((curMonth == intMonth) && (curDay < intDay))) {
    birthYear--;
  }

  return birthYear;
}

/**********
    Joey Mazzarelli

    Provides a way to create a fancy popup on any page.
    There is only one popup per page at any time, so all the functions
    work on a single instance of the popup
    functions:

        FancyPopup.setContents(contents)
        FancyPopup.clearContents()
        FancyPopup.showLoader()
        FancyPopup.show()
        FancyPopup.hide()

        *.setCloseHandler(funcRef) ... if func returns true, hide() is subsequently called.
        *.show() calls clearCloseHandler() to avoid lingering handlers since the object is shared.
        so, call setCloseHandler after show


******/

Abstract.Popup = function(divName, colPrefix) {
	this.savedDivName = divName;
    this.loaderTemplate = '';
    this.fancyTemplate = '';
    this.popupName = 'fancy';
    this.className = 'Abstract.Popup';
    this.container = null;
    this.contents = '';
    this.isLoading = false;
    this.isDisplayed = false;
    this.contents = '';
    this.popupPos = 0;
    this.closeHandler = null;
    this.putBackObj = null;
    this.putObj = null;
    this.isClickthrough= false;
    this.number = 0;
    this.colorPrefix='';
	if(colPrefix!=undefined)
		this.colorPrefix=colPrefix;


    this.initialize = function() {
    	this.number = objectRegistry.register(this)
   		this.popupName = 'fancy'+this.number.toString()
   		this.className = 'objectRegistry.get('+this.number.toString()+')'
		this.container = document.createElement('div');
    	// preload images
        /*var img1 = new Image();
        var img2 = new Image();
        var img3 = new Image();
        var img4 = new Image();
        var img5 = new Image();
        var img6 = new Image();
        var img7 = new Image();
        var img8 = new Image();
        var img9 = new Image();

        img1.src = '/images/popup/tr_hover.png';
        img2.src = '/images/popup/tl.png';
        img3.src = '/images/popup/ts.png';
        img4.src = '/images/popup/tr.png';
        img5.src = '/images/popup/ls.png';
        img6.src = '/images/popup/rs.png';
        img7.src = '/images/popup/bl.png';
        img8.src = '/images/popup/bs.png';
        img9.src = '/images/popup/br.png';*/

        this.loaderTemplate =
            '<div id="fp_loader'+this.number.toString()+'">' +
            '</div>';

		  this.fancyTemplateBackup =
            '<div id="' + this.popupName + 'PopupTableDiv">' +
             '<table id="tableBorder" class="cartFancyPopupTable" cellpadding="0" cellspacing="0"><tr>' +
              '<td><table cellpadding="0" cellspacing="0" border="0" class="cartFancyPoptop"><tr>' +
               '<td class="cartFancyPoptopLeftBorder"></td>' +
               '<td><div class="cartFancyPoptopCenterBorder"></div></td>' +
               '<td class="cartFancyPoptopRightBorder"><img id = "FancyPopup_closer" class="cartFancyPopheader_closeBtn" src="/estore/images/cart/mbp/close.png" alt="" border="0" onclick="' + this.className + '.closeClick()" /></td></tr><tr>' +
               '<td class="cartFancyPopleftSideBorder"></td>' +
               '<td class="cartFancyPopcenterContent">' +
                '<div id="' + this.popupName + 'PopupBody" class="PopupBody"></div></td>' +
               '<td class="cartFancyPoprightSideBorder"></td></tr><tr>' +
               '<td class="cartFancyPopbottomLeftBorder"></td>' +
               '<td><div class="cartFancyPopbottomCenterBorder"></div></td>' +
               '<td class="cartFancyPopbottomRightBorder">' +
              '</td></tr></table>' +
             '</td></tr></table>' +
            '</div>';

        this.fancyTemplate = this.fancyTemplateBackup;

        this.container.innerHTML =
            '<div id="' + this.popupName + 'PopupDiv" style="display:none;overflow:visible;position:absolute;top:0px;left:0px;z-index:1000;">' +
            '	<table height="100%" width="100%" cellpadding="0" cellspacing="0" border="0" style="">' +
            '		<tr>' +
            '			<td valign="middle" align="center" id="' + this.popupName + 'PopupPaneParent">' +
            '				<div id="' + this.popupName + 'PopupPane">' + this.fancyTemplate + '</div>' +
            '			</td>' +
            '		</tr>' +
            '	</table>' +
            '</div>';

        document.body.appendChild(this.container);

    }

    this.setContents = function(contents) {
        this.contents = contents;

        if (this.putObj != null && this.putBackObj != null) {
            this.putBackObj.appendChild(this.putObj);
            this.putObj = null;
            this.putBackObj = null;
        }

        if(this.isDisplayed && !this.isLoading) {
            $(this.popupName + 'PopupBody').innerHTML = this.contents;
        }
    }

    this.setContentObj = function(objId) {
        var obj = $(objId);
        if (obj) {
            if (this.putBackObj != null && this.putObj != null) {
                this.putBackObj.appendChild(this.putObj);
                this.putBackObj = null;
                this.putObj = null;
            }

            this.putBackObj = obj.parentNode;
            this.putObj = obj;

            this.contents = '';
            if (this.isDisplayed && !this.isLoading) {
                this.show()
            }
        }
    }

    this.clearContents = function() {
        this.contents = '';

        if (this.putObj != null && this.putBackObj != null) {
            this.putBackObj.appendChild(this.putObj);
            this.putObj = null;
            this.putBackObj = null;
        }

        if(this.isDisplayed && !this.isLoading) {
            $(this.popupName + 'PopupBody').innerHTML = this.contents;
        }
    }

    this.showLoader = function() {
        if(this.isLoading) {
            return;
        }
        this.hideBleeders();

        if (this.putObj != null && this.putBackObj != null) {
            this.putBackObj.appendChild(this.putObj);
            this.putObj = null;
            this.putBackObj = null;
        }


        $(this.popupName + 'PopupPane').innerHTML = this.loaderTemplate;
        if(!this.isDisplayed) {
            $(this.popupName + 'PopupDiv').style.display = 'block';
        }
        this.isDisplayed = true;
        this.isLoading = true;
    }

    this.hideBleeders = function(parentId) {
        if(Is.ie) {
            hideAllSelects(parentId);
        }
    }

    this.showBleeders = function() {
        if(Is.ie) {
            showAllSelects();
        }
    },

    this.show = function() {
    	objectRegistry.run(function() {
    			this.pause();
    		}, 'syncher')

        this.clearCloseHandler();
        if(!this.isLoading) {
            if (this.putObj) {
                this.hideBleeders(this.putObj.id);
            } else {
                this.hideBleeders();
            }
        }

        if (this.isClickthrough) {
            $(this.popupName + 'PopupPaneParent').appendChild($(this.popupName + 'PopupPane'));
            this.isClickthrough = false;
        }
        
        $(this.popupName + 'PopupPane').innerHTML = this.fancyTemplate;
        $(this.popupName + 'PopupDiv').style.display = 'block';
        $(this.popupName + 'PopupBody').innerHTML = this.contents;

        if (this.putObj != null && this.putBackObj != null) {
            $(this.popupName + 'PopupBody').appendChild(this.putObj);
        }

        this.isLoading = false;
        this.isDisplayed = true;
    }
       
    this.allowClickthrough = function() {
        document.body.appendChild($(this.popupName + 'PopupPane'));
        $(this.popupName + 'PopupDiv').style.display = 'none';
        this.isClickthrough = true;
    }

    this.setCloseHandler = function(handler) {
        this.closeHandler = handler;
    }
    this.clearCloseHandler = function() {
        this.closeHandler = this.hide;
    }

    this.hide = function() {
    	objectRegistry.run(function() {
    			this.unpause();
	    	}, 'syncher')

        if(this.isDisplayed == false) {
            return;
        }

        if (this.putObj != null && this.putBackObj != null) {
            this.putBackObj.appendChild(this.putObj);
            this.putObj = null;
            this.putBackObj = null;
        }

        if (this.isClickthrough) {
            $(this.popupName + 'PopupPaneParent').appendChild($(this.popupName + 'PopupPane'));
            this.isClickthrough = false;
        }

        $(this.popupName + 'PopupPane').innerHTML = '';
        $(this.popupName + 'PopupDiv').style.display = 'none';

        this.isDisplayed = false;
        this.isLoading = false;

        if(SimplePopup) {
            SimplePopup.hide();
        }

        this.showBleeders();
        return false;
    }

    this.closeClick = function() {
        if(this.closeHandler()) {
            this.hide();
        }
    }

    this.closeHover = function() {
        $(this.popupName + '_closer').className = this.colorPrefix+'closeFPhover';
    }

    this.closeOut = function() {
        $(this.popupName + '_closer').className = this.colorPrefix+'closeFPnormal';
    }

    this.makeSaveable = function(fnString) {
        this.fancyTemplate = this.fancyTemplateBackup.replace('<td class="fp_br_c" width="33" id="fancyPopupBR'+this.number.toString()+'"><div></div>', '<td class="fp_br_c" width="70" id="fancyPopupBR'+this.number.toString()+'"><div><img src=staticServer+"/images/mystore/mypb/bl_c_save.gif" usemap="#fancySaveMap'+this.number.toString()+'" style="border: none; margin-right: 6px; margin-top: -1px; float: right;"/>'+
        '<map name="fancySaveMap'+this.number.toString()+'"> <area href="#" onclick="'+fnString+'" shape=RECT coords="1,1,70,24"> </map></div>')
    }

    this.setZIndex = function(num) {
    	this.container.style.zIndex = num.toString()
    }

    addBodyOnloadHandlerOrRun(this.initialize.bind(this))
}


var PositionedPopupMaker = function(toUse, colorPrefix) {

    if (!toUse) this.popup = new Abstract.Popup(null, colorPrefix)
    else this.popup = toUse
    this.currentWindowWidth;
    this.setContents = function(args) { return this.popup.setContents(args); }
    this.setContentObj= function(args) { return this.popup.setContentObj(args); }
    this.clearContents = function() { return this.popup.clearContents(); }
    this.showLoader = function() { return this.popup.showLoader(); }
    this.hide = function() { return this.popup.hide(); }
    this.show = function() {return this.popup.show(); }
    this.allowClickthrough = function() { return this.popup.allowClickthrough(); }
    this.setCloseHandler = function(func) {return this.popup.setCloseHandler(func); }
    this.clearCloseHandler = function(func) {return this.popup.clearCloseHandler(); }
    this.makeSaveable = function(fn) {return this.popup.makeSaveable(fn);}
	  this.setZIndex = function(num) {return this.popup.setZIndex(num)}

    this.isDisplayed = function() { return this.popup.isDisplayed; }
    this.isLoading = function() { return this.popup.isLoading; }
  //to fix the bag position in browser jira www-6346 starts
    this.setPositionOfBag = function(elemId, offsetX, offsetY) {
        var pos = getTopLeft($(elemId));
        var x = pos['x'] + offsetX;
        var y = pos['y'] + offsetY;

        $(this.popup.popupName + 'PopupDiv').style.top = '0px';
        $(this.popup.popupName + 'PopupPane').style.left = x + 'px';
        $(this.popup.popupName + 'PopupPane').style.top = y + 'px';
        $(this.popup.popupName + 'PopupPane').addClassName("myBagPopup");
    }
    //www-6346 jira ends
    this.setPosition = function(elemId, offsetX, offsetY) {
        var pos = getTopLeft($(elemId));
        var x = pos['x'] + offsetX;
        var y = pos['y'] + offsetY;
        $(this.popup.popupName + 'PopupDiv').style.top = '0px';
        $(this.popup.popupName + 'PopupPane').style.position = 'absolute';
        $(this.popup.popupName + 'PopupPane').style.left = x + 'px';
        $(this.popup.popupName + 'PopupPane').style.top = y + 'px';
    }
    //This function is to attempt to keep the popup at a reasonable position in the window when the window resizes
    //NOTE: for now this only adjusts the x value not y which seems consistent with what the browers does with other elements
    this.adjustPositionOnWindowResize = function()
    {
       this.currentWindowWidth=document.body.clientWidth;
       window.onresize=this.adjustPosition.bind(this);
    }
    //This is the actual logic for repositioning the popup when the window resizes
    this.adjustPosition = function()
    {
      popup=$(this.popup.popupName + 'PopupPane')
      adjustVal=(document.body.clientWidth-this.currentWindowWidth)/2;
      var curleft=popup.style.left
      curleft=curleft.substring(0,curleft.indexOf('p'))
      var newleft=Number(curleft)+adjustVal
      popup.style.left=newleft+'px'
      this.currentWindowWidth=document.body.clientWidth;
    }

}

var PositionedPopup = new PositionedPopupMaker()

var FancyPopupMaker = function(toUse) {

    if (!toUse) this.popup = new Abstract.Popup(divName)
    else this.popup = toUse

    this.setContents = function(args) { return this.popup.setContents(args); }
    this.setContentObj= function(args) { return this.popup.setContentObj(args); }
    this.clearContents = function() { return this.popup.clearContents(); }
    this.showLoader = function() {
        this.clearPosition();
        this.popup.showLoader();
    }
    this.hide = function() { return this.popup.hide(); }
    this.setCloseHandler = function(func) {return this.popup.setCloseHandler(func); }
    this.clearCloseHandler = function() {return this.popup.clearCloseHandler(); }
    this.makeSaveable = function(fn) {return this.popup.makeSaveable(fn);}
	this.setZIndex = function(num) {return this.popup.setZIndex(num)}

    this.setPosition = Prototype.emptyFunction

    this.isDisplayed = function() { return this.popup.isDisplayed; }
    this.isLoading = function() { return this.popup.isLoading; }

    this.show = function() {
        this.clearPosition();
        this.popup.show();
    }
    this.clearPosition = function() {
        $(this.popup.popupName + 'PopupPane').style.position = '';
        $(this.popup.popupName + 'PopupPane').style.left = '';
        $(this.popup.popupName + 'PopupPane').style.top = '';
        this.popup.popupPos = getTop();
        $(this.popup.popupName + 'PopupDiv').style.top = this.popup.popupPos + 'px';
        $(this.popup.popupName + 'PopupDiv').style.height = '100%'
    }
};

var FancyPopup = new FancyPopupMaker(PositionedPopup.popup)

var SavePopup = new FancyPopupMaker(new Abstract.Popup())

SavePopup.oneShot = function(refId, contents) {
	this.setContents(contents)
	this.show()
}

SavePopup.popup.closeClick = function() {
            ProductSaverSettings.onFinishSave();
            this.hide();
        }
//FancyPopUp ProductDetail page tabs
function prodmsg(w ){
    if(w == "shippingDtl"){
        document.getElementById("shippingDtl").style.display="block" ;
        document.getElementById("returnInstruc").style.display="none" ;
        document.getElementById("pdp_nav-1a").className="active" ;
        document.getElementById("pdp_nav-2a").className="inactive" ;
    }
    else{
        document.getElementById("shippingDtl").style.display="none" ;
        document.getElementById("returnInstruc").style.display="block" ;
        document.getElementById("pdp_nav-1a").className="inactive" ;
        document.getElementById("pdp_nav-2a").className="active" ;
    }
}

//ProductPageWidget page tabs
function prodmsgD(w ){
    if(w == "shippingDtl"){
        document.getElementById("shippingDtlD").style.display="block" ;
        document.getElementById("returnInstrucD").style.display="none" ;
        document.getElementById("pdp_nav-1aD").className="active" ;
        document.getElementById("pdp_nav-2aD").className="inactive" ;
    }
    else{
        document.getElementById("shippingDtlD").style.display="none" ;
        document.getElementById("returnInstrucD").style.display="block" ;
        document.getElementById("pdp_nav-1aD").className="inactive" ;
        document.getElementById("pdp_nav-2aD").className="active" ;
    }
}
function included_simplePopup_dot_js() { }

/**  EXAMPLE
	<div style="height:0px;overflow:hidden;" id="popup">
		<!-- you can position it relatively here -->
		<div style="width:100px;height:100px;background-color:red;color:white;position:relative;top:-100px">HELLO</div>
	</div>
	<a href="javascript:SimplePopup.oneShot('popup');">open popup</a><br />
	<a href="javascript:SimplePopup.hide();">close popup</a>
*/

Abstract.SimplePopup = Class.create();
Abstract.SimplePopup.prototype = {
	iframe : null,
	element : null,
	putObj : null,
	putBackObj : null,
	hidden : true,
	id : 'simple_popup_',
	callbackStorage : null,
	disappearing : false,
	selectsHidden : false,
	isPremade : false,
	contentsCentered : false,
	zIndex : 1000,
	onClickOff : function (e) {
		this.hide()	
	},
	initialize : function (divToUse) {
		if(this.element != null) {
			return;
		}
		
		this.id = 'simple_popup_'+simplePopups
		simplePopups++
		
		//create div popup
		if (!divToUse) {
			this.element = document.createElement('div')
		} else {
			this.element = $(divToUse)	
			this.isPremade = true
		}
		this.element.style.position = 'absolute'
		this.element.style.top = this.element.style.left = '0px'
		this.element.style.visibility = 'hidden'
		this.element.id = this.id + 'div'
		this.element.isSimplePopupContainer = true;
					
		this.iframe = document.createElement('iframe')
		this.iframe.id = this.id + '_iframe'
		this.iframe.src = 'javascript:false;'
		this.iframe.scrolling = 'no'
		this.iframe.frameBorder = '0'
		this.iframe.style.position = 'absolute'
		this.iframe.style.top = this.iframe.style.left = '0px'
		this.iframe.style.display = 'none'
		
		addBodyOnloadHandlerOrRun(this.attach.bindAsEventListener(this))
	},
	attach : function () {
		document.body.appendChild(this.element)
		document.body.appendChild(this.iframe)
	},
	setPlacement : function(refId, offsetX, offsetY) {
		var pos 
		if (refId!=null) {
			if (typeof(refId) == 'string') pos = getTopLeft($(refId))
			else pos = refId
			this.element.style.top = (pos['y'] + (offsetY!=null?offsetY:0)) + 'px'
			this.element.style.left = (pos['x'] + (offsetX!=null?offsetX:0)) + 'px'
			if (Is.ie) {
				this.iframe.style.top = (pos['y'] + (offsetY!=null?offsetY:0)) + 'px'
				this.iframe.style.left = (pos['x'] + (offsetX!=null?offsetX:0)) + 'px'	
			}
		} else {
			this.element.style.top = (offsetY!=null?offsetY:0) + 'px'
			this.element.style.left = (offsetX!=null?offsetX:0) + 'px'
			if (Is.ie) {
				this.iframe.style.top = (offsetY!=null?offsetY:0) + 'px'
				this.iframe.style.left = (offsetX!=null?offsetX:0) + 'px'	
			}
		}
	},
	setPosition : function(refId, offsetX, offsetY) {
		/* I don't know why I called it "setPlacement" */
		this.setPlacement(refId, offsetX, offsetY)
	},
	setContents : function(contents) {
		if (this.putBackObj != null && this.putObj != null) {
			this.putBackObj.appendChild(this.putObj)
			this.putBackObj = null
			this.putObj = null
		}
		this.element.innerHTML = contents
		this.contentsCentered = false;
	},
	oneShot : function(refId, contents) {
		if(!contents) {
			contents = $(refId).innerHTML
		}
		this.setPlacement(refId)
		this.setContents(contents)
		this.show()
	},
	oneShotCentered : function(contents) {
		this.element.style.height = "100%"
		this.setPosition(null, 0, getTop())
		this.element.innerHTML = '<table cellPadding="0" cellSpacing="0" height="100%" width="100%">'+
					   '	<tr><td align="center" valign="middle" height="100%">'+
								contents +
					   '	</td></tr>'+
					   '</table>'
		this.showNoIFrame()
	},
	oneShotNow : function(refId, contents) {
		if(!contents) {
			contents = $(refId).innerHTML
		}
		this.setPlacement(refId)
		this.setContents(contents)
		this.showNow()
	},
	oneShotObj : function (refId, obj) {
		if (obj != null) {
			if (this.putBackObj != null && this.putObj != null) {
				this.putBackObj.appendChild(this.putObj)
				this.putBackObj = null
				this.putObj = null
			}
			this.element.style.top = this.element.style.left = "-1000px"
	
			this.putBackObj = obj.parentNode
			this.putObj = obj
			this.element.innerHTML = ''
			this.element.appendChild(obj)
	
			this.show()
			this.setPlacement(refId, -obj.scrollWidth, 15);
		}
	},
	favShotObj : function (refId, obj) {
		if (obj != null) {
			if (this.putBackObj != null && this.putObj != null) {
				this.putBackObj.appendChild(this.putObj)
				this.putBackObj = null
				this.putObj = null
			}
			this.element.style.top = this.element.style.left = "-1000px"
	
			this.putBackObj = obj.parentNode
			this.putObj = obj
			this.element.innerHTML = ''
			this.element.appendChild(obj)
	
			this.show()
			this.element.style.position = 'fixed'
			this.setPlacement(refId, -obj.scrollWidth, 15);
		}
	},	
	hideNow : function(callback) {
		callback = callback || Prototype.emptyFunction;
		this._hide()
		callback()
	},
	hide : function(callback) {
		callback = callback || Prototype.emptyFunction;
		if(this.hidden) {
			return callback();
		}
		this.disappearing = true;
		this.callbackStorage = callback;
		return Effects.fadeOut(this.element, -0.15, this._hideHelper.bind(this));   //this._hide.bind(this));
	},
	_hideHelper : function() {
		this._hide();
		this.disappearing = false;
		var callback = this.callbackStorage;
		this.callbackStorage=null;
		return callback();
	},
	_hide : function() {
		this.hidden = true;
		this.element.style.display = 'none'
		this.element.style.visibility = 'hidden'
		this.element.style.opacity = 0.0
		if (this.selectsHidden) this.showBleeders();
		if (this.putBackObj != null && this.putObj != null) {
			this.putBackObj.appendChild(this.putObj)
			this.putBackObj = null
			this.putObj = null
		}
		if(Is.ie) {
			this.iframe.style.display = 'none'
		}
	},
	show : function(callback, iframe) {
		if(!this.hidden) {
			return;
		}
		
		callback = callback || Prototype.emptyFunction;
		var self = this;
		var onshow = function() {
			self.fixIframe();
			callback();
		}
		
		this.element.style.zIndex = this.zIndex
		
		Effects.fadeIn(this.element, 0.20, onshow);
		this.hidden = false;
	},
	showNow : function(callback, iframe) {
		if(!this.hidden) {
			return;
		}
		
		callback = callback || Prototype.emptyFunction;
		var self = this;
	
		this.element.style.zIndex = this.zIndex
	
		if(Is.ie) {
			this.element.style.display = 'block';
			this.element.style.visibility = 'visible';
			self.fixIframe();
			return callback();
		}
		this.element.style.display = 'block';
		this.element.style.visibility = 'visible';
		this.element.style.opacity = 1.0;
		this.hidden = false;
		self.fixIframe();
		callback();
	},
	showNoIFrame : function(callback) {
		if(!this.hidden) {
			return;
		}
		
		this.hideBleeders()
		
		callback = callback || Prototype.emptyFunction;
		
		this.element.style.zIndex = this.zIndex
		
		Effects.fadeIn(this.element, 0.20, callback);
		this.hidden = false;
		this.iframe.style.display = 'none'
	},
	showNowNoIFrame : function(callback) {
		if(!this.hidden) {
			return;
		}
		this.hideBleeders()
		
		callback = callback || Prototype.emptyFunction;
	
		this.element.style.zIndex = this.zIndex
	
		if(Is.ie) {
			this.element.style.display = 'block';
			this.element.style.visibility = 'visible';
			return callback();
		}
		this.element.style.display = 'block';
		this.element.style.visibility = 'visible';
		this.element.style.opacity = 1.0;
		this.hidden = false;
		callback();
	},
	fixIframe : function () {
		if(Is.ie && (this.iframe === undefined || this.iframe != false)) {
			this.iframe.style.zIndex = this.zIndex-1
			this.iframe.style.width = this.element.scrollWidth + 'px'
			this.iframe.style.height = this.element.scrollHeight + 'px'
			this.iframe.style.display = 'block'
		} else if(Is.ie) {
			this.iframe.style.display = 'none'
		}		
	},
	clear : function() {
		if(Is.ie) {
			this.hide();
		}
	},
	hideAll : function(e) {
		var mX
		var mY
		if (Is.ie) {
			mX = event.clientX + document.body.scrollLeft
			mY = event.clientY + getTop()
		} else {
			mX = e.pageX
			mY = e.pageY
		}
		if(mX == 0 && mY == 0) {
			return
		} else {
			var d = this.element
			var dY = parseInt(d.style.top.substring(0, d.style.top.toString().length - 2), 10)
			var dX = parseInt(d.style.left.substring(0, d.style.left.toString().length - 2), 10)
			var dW = parseInt(d.scrollWidth, 10)
			var dH = parseInt(d.scrollHeight, 10)
			if(dW == 0 || dH == 0) {
				return
			} else {
				if((mY < dY || mY > dY+dH) || (mX < dX || mX > dX+dW)) {
					var element = Event.element(e);
					while(element && !element.isSimplePopupContainer) {
						element = element.parentNode;
					}
					if(element == null)
						this.onClickOff()
				}
			}/* valid click */
		}/* valid coordinates */
	},/* hide all */
	
	hideBleeders : function(parentId) {
		if(Is.ie) {
			hideAllSelects(parentId);
			this.selectsHidden = true;
		}
	},
	
	showBleeders : function() {
		if(Is.ie) {
			showAllSelects();
			this.selectsHidden = false;
		}
	}
}

var simplePopups = 0
var SimplePopup = new Abstract.SimplePopup();
//var SimplePopup2 = new Abstract.SimplePopup();

// This doesn't need to be called twice. It gets called in the initialize function of the SimplePopup class
//addBodyOnloadHandler(SimplePopup.attach.bindAsEventListener(SimplePopup))
//addBodyOnloadHandler(SimplePopup2.attach.bindAsEventListener(SimplePopup2))
Event.observe(document, 'click', SimplePopup.hideAll.bindAsEventListener(SimplePopup), false);
var Ads = {};

Ads.Logger = {
    logger : '/jsp/do/ad.jsp',
    logClick : function(pId) {
        //since flash ads are logged and redirected on the server side (due to embedded actionscript)
        //this is called for image ads
        var url = this.logger + '?l=c&a=' + pId + '&p=';
        importXML(url, Prototype.emptyFunction);
    },
    logImpression : function(pId, spotKey) {
        if(spotKey.indexOf('ps_ad_placement_') == 0) {
            spotKey = spotKey.substring('ps_ad_placement_'.length);
        }
        var url = this.logger + '?l=i&a=' + pId + '&p=' + spotKey;
        importXML(url, Prototype.emptyFunction);
    }
};

Ads.AdTypes = {
    'ABSTRACT'  : 0,
    'FLASH'     : 1,
    'IMAGE'     : 2,
    'PRODUCT'   : 3,
    'TEXT'      : 4
};

Ads.AbstractAd = Class.create();
Ads.AbstractAd.prototype = {
    type : Ads.AdTypes.ABSTRACT,
    adId : 0,
    pId : 0, /* placement id */
    active : true,
    target : '_blank',
    placement : null,
    weight : 0,
    initialize : function() {},
    getHtml : function() { return ''; },
    show : function() {
        Ads.Logger.logImpression(this.adId, this.placement.spotKey);
        $(this.placement.spotKey).innerHTML = this.getHtml();
    }
};

Ads.FlashAd = Class.create();
Object.extend(Ads.FlashAd.prototype, Ads.AbstractAd.prototype);
Object.extend(Ads.FlashAd.prototype, {
    type : Ads.AdTypes.FLASH,
    clickTags : [],
    backupImage : '',
    backupUrl : '',
    flashUrl : '',
    flash : null,

    getHtml : function() {
        if(this.flash == null) {
            var variables = {
                adSWF : this.flashUrl,
                flashClickHandler : '/jsp/do/ad.jsp',
                adId : this.adId
            };

            var urlCount = 0;
            this.clickTags.each(function(item) {
                variables['url' + (++urlCount)] = item;
            });
            this.flash = new Flash(this.flashUrl, this.placement.width, this.placement.height, {}, variables, this.adId);
        }/* flash == null */

        return this.flash.getHtml();
    }
});

Ads.ImageAd = Class.create();
Object.extend(Ads.ImageAd.prototype, Ads.AbstractAd.prototype);
Object.extend(Ads.ImageAd.prototype, {
    type : Ads.AdTypes.IMAGE,
    imageUrl : '',
    clickUrl : '',

    getHtml : function() {
        return '<a href="' + this.clickUrl + '" target="' + this.target + '" onclick="Ads.Logger.logClick(\'' + this.pId + '\');" target="_blank"><img src="' + this.imageUrl + '" border="0" hspace="0" vspace="0" /></a>'
    }
});

Ads.TextAd = Class.create();
Object.extend(Ads.TextAd.prototype, Ads.AbstractAd.prototype);
Object.extend(Ads.TextAd.prototype, {
    type : Ads.AdTypes.TEXT
});

Ads.ProductAd = Class.create();
Object.extend(Ads.ProductAd.prototype, Ads.AbstractAd.prototype);
Object.extend(Ads.ProductAd.prototype, {
    type : Ads.AdTypes.PRODUCT
});


Ads.AbstractCycler = Class.create();
Ads.AbstractCycler.prototype = {
    initialize : function() { },
    cycle : function() {},
    SEQUENTIAL : 0,
    RANDOM : 1
};



/**
 * cycles through ads by chosing one randomly with a distribution based on the weights
 */
Ads.RandomCycler = Class.create();
Object.extend(Ads.RandomCycler.prototype, Ads.AbstractCycler.prototype);
Object.extend(Ads.RandomCycler.prototype, {
    weights : [],
    max : 0,

    initialize : function(ads) {
        this.max = 0;
        for(var i=0; i<ads.length; i++) {
            var ad = ads[i];
            var start = this.max;
            this.max += ad.weight;
            var end = this.max;
            this.weights.push({
                start:start,
                end:end,
                ad:ad
            });
        }
    },

    cycle : function() {
        var r = Math.floor((Math.random() * this.max));
        for(var i=0; i<this.weights.length; i++) {
            if(r >= this.weights[i].start && r < this.weights[i].end) {
                return this.weights[i].ad;
            }
        }
        return new Ads.AbstractAd();
    }
});


/**
 * cycles through ads with no regard to weights
 */
Ads.SequentialCycler = Class.create();
Object.extend(Ads.SequentialCycler.prototype, Ads.AbstractCycler.prototype);
Object.extend(Ads.SequentialCycler.prototype, {
    ads : [],
    current : -1,

    initialize : function(ads) {
        this.ads = ads;
    },

    cycle : function() {
        var current = this.current;
        var ad = new Ads.AbstractAd();
        do {
            this.current = (this.current+1) % this.ads.length;
            ad = this.ads[this.current];
            //at worst this will loop through the list once and repeat the current
        } while( !ad.active && this.current != current ) ;
        return ad;
    }
});


Ads.Placement = Class.create();
Ads.Placement.prototype = {
    adDuration : 60 * 1000,
    spotKey : null,
    ads : [],
    placementId : 0,
    width : 0,
    height : 0,
    cycler : Ads.AbstractCycler.RANDOM,

    initialize : function(spotKey, cycler) {
        this.spotKey = spotKey;
        this.cycler = cycler || this.cycler;
    },

    show : function() {
        var ad = this.cycler.cycle();

        if(!Is.flash && ad.type == Ads.AdTypes.FLASH) {
            //show the backup ad instead.
            var placement = ad.placement;
            ad = Object.extend(new Ads.ImageAd(), {
                adId : ad.adId,
                weight : ad.weight,
                pId : ad.pId,
                imageUrl : ad.backupImage,
                clickUrl : ad.backupUrl
            });
            ad.placement = placement;
        }

        ad.show();
    },

    start : function () {
        if(this.ads.length > 0) {
            if(this.cycler == Ads.AbstractCycler.RANDOM) {
                this.cycler = new Ads.RandomCycler(this.ads);
            } else if(this.cycler == Ads.AbstractCycler.SEQUENTIAL) {
                this.cycler = new Ads.SequentialCycler(this.ads);
            }
            //show the first one and set a timer for the swapping
            this.show();
            setInterval(this.show.bind(this), this.adDuration);
        } else {
            //no need to take up space
            Element.hide($(this.spotKey));
        }
    },

    addAd  : function(ad) {
        //make sure the ad has this placementId in it
        ad.placement = this;
        this.ads.push(ad);
    }
};
function getDaysInMonth (iMonth, iYear) {
	return 32 - new Date(iYear, iMonth - 1, 32).getDate();

}
function syncDaysWithMonth (iMonth, iYear, dSelect) {
	var s = $(dSelect);			// s
	var i = s.options.length - 1;					
	var d = getDaysInMonth(iMonth, iYear);				// d
	var v = 0;
	var sel = 0;
	if (i >= 0) {
		v = s.options[i].value;							// v
		sel = s.selectedIndex;
	}
	if (d < v) {
		var dif = v - d;
		while (dif > 0) {
			if (s.options[i].value == sel) s.selectedIndex = 0;
			s.options[i--] = null;						// Remove
			dif--;
		}
	}
	else if (d > v) {
		var day = v;
		while (day < d) {
			i++;
			day++;
			s.options[i] = new Option(day, day);		// Append														
		}
	}
}
function recordBuyNow(productId,price,id,tagName,clickType) {
	var VICookieName = "s_vi="
 	var lCookies = document.cookie.split(';')
 	var sVI = "" //Omniture's Visitor ID from Cookie
	var img = new Image()

	for(var i=0;i < lCookies.length;i++)
	{
		//Get Omniture's Visitor ID Cookie --> s_vi
		//The raw value retreived from the ?s_vi? cookie will be similar to the following:
		//s_vi value: [CS]v1|4471F593000033AE-A000C4E00000270[CE]
		//The actual Visitor Id, as required by the XML API, are the values between the pipe (?|?) and the opening bracket ?[?:
		//Visitor Id: 4471F593000033AE-A000C4E00000270
		var c = lCookies[i]
		while (c.charAt(0)==' ') c = c.substring(1,c.length)
		if (c.indexOf(VICookieName) == 0){
			sVI = c.substring(c.indexOf("|")+1,c.indexOf("[CE"))
			//alert("c: " + c + "; sVI: " + sVI)
		}
	}
	
	
	if (!tagName) {
		tagName = buyNowInfo.tag;
	}
	var img = new Image()
	var url = buyNowInfo.url + ';jsessionid=' + jspSessionId + '?productId=' + productId + '&price=' + price + 
				'&userId=' + buyNowInfo.userid + '&sVI=' + sVI + '&' + buyNowInfo.buynowid + '=' + id
	if (clickType) {
		url += '&' + buyNowInfo.source + '=' + clickType
	}
	img.src=url
}

function buyNowClick(productId, price, url, tagName, source, categoryID, clickType) {
	var date = new Date()
	var d = new Date()
	var start = new Date(2005, 0, 1)
	var constant = start.getTime()
	var n = Math.round((d.getTime() - constant)/1000)
	var id = buyNowInfo.ad + 'G' + buyNowInfo.tracking + 'T' + n
	
	
	// SiteCatalyst
	LogClickBuyNow(productId, price, categoryID, buyNowInfo.userid, buyNowInfo.visitorid, buyNowInfo.ad, n, clickType)
	// End SiteCatalyst

	recordBuyNow(productId,price,id,tagName,clickType)
    
    var userId = buyNowInfo.userid != -1 ? buyNowInfo.userid : buyNowInfo.visitorid;
    
    var separator='&'
    if (url.indexOf('?')==-1) separator='?'
	url += separator + tagName + '=' + id
    var murl = '/jsp/spotlight/buyNowTag.jsp?productId=' + productId + 
        '&price=' + price + '&orderId=' + userId + 
        '&url=' + encodeURIComponent(url);
    var newWindow = window.open(murl)
	newWindow.focus()
}
function MerchSpecialClick(productId, price, url, tagName, source, clickType) {
	var date = new Date()
	var d = new Date()
	var start = new Date(2005, 0, 1)
	var constant = start.getTime()
	var n = Math.round((d.getTime() - constant)/1000)
	var id = buyNowInfo.ad + 'G' + buyNowInfo.tracking + 'T' + n
	
	
	// SiteCatalyst
	LogMerchantSpecials(productId, price, buyNowInfo.userid, buyNowInfo.visitorid, buyNowInfo.ad, n)
	// End SiteCatalyst

	recordBuyNow(productId,price,id,tagName)
    
    var userId = buyNowInfo.userid != -1 ? buyNowInfo.userid : buyNowInfo.visitorid;
    
    var separator='&'
    if (url.indexOf('?')==-1) separator='?'
	url += separator + tagName + '=' + id
    var murl = '/jsp/spotlight/buyNowTag.jsp?productId=' + productId + 
        '&price=' + price + '&orderId=' + userId + 
        '&url=' + encodeURIComponent(url);
    var newWindow = window.open(murl)
	newWindow.focus()
}

var Flash = Class.create();
Flash.prototype = {
	swf : '',
	width : '100%',
	height : '100%',
	id : '',
	params : { 
		wmode : 'opaque',
		play : 'true',
		quality : 'high'
	},
	variables : {},
	
	initialize : function(swf, width, height, params, variables, id) {
		this.swf = swf;
		this.width = width || this.width;
		this.height = height || this.height;
		this.params = Object.extend(this.params, params);
		this.variables = variables;
		this.id = id || Object.generateId();
	},
	
	getHtml : function(id) {
		var variableString = this.getVars();
		var html = '';
		
		this.params['base'] = this.swf.substring(0, this.swf.lastIndexOf('/') + 1);
		
		if (Is.ie) {
			html += '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="' + this.width + '" height="' + this.height + '" id="' + this.id + '">';
			html += '<param name="movie" value="' + this.swf + '" />';
			for (var param in this.params) {
				html += '<param name="' + param + '" value="' + this.params[param] + '" />';
			}
			html += '<param name="flashVars" value="' + variableString + '" />';
			html += '</object>';
		} else {
			html += '<embed type="application/x-shockwave-flash" src="' + this.swf + '" width="' + this.width + '" height="' + this.height + '" id="' + this.id + '"';
			for (var param in this.params) {
				html += ' ' + param + '="' + this.params[param] + '"';
			}
			html += ' flashVars="' + variableString + '"';
			html += '></embed>';
		}
		return html;
	},
	
	getVars : function() {
		var variablePairs = new Array();
		var variableString = '';
		for (var variable in this.variables) {
			variablePairs.push(variable + "=" + escape(this.variables[variable]));
		}
		if (variablePairs.length > 0) {
			variableString = variablePairs.join("&");
		}
		return variableString;
	},
	
	show : function(elemId) {
		$(elemId).innerHTML = this.getHtml();
	}
};
function included_productSaver_dot_js() { }

addBodyOnloadHandler(setRecipOccPairs)
var newRecipReloadRequired = false
var notifySavedItemsBox = function(){};   

Abstract.ProductSaverSettings = Class.create();
Abstract.ProductSaverSettings.prototype = {
		canAddRecips : true,
		initialize: Prototype.emptyFunction, 
		personJustSaved : false,
		recommendRotatorDefault : null,
		occasionRotatorDefault : null,
		DPSDefault : null,
		onBeginSave : Prototype.emptyFunction,
		onFinishSave : Prototype.emptyFunction,


		onClickOffSave : function () {
	SavePopup.hide()
	ProductSaverSettings.onFinishSave()
},
onClickOffLoad : function () {

},

chooseDefaultOccasion : Prototype.emptyFunction,
recipientInfoSource : function () 
{

	if(typeof(getRecipientInfo)  == 'undefined' )
		return '0'
		else
			return getRecipientInfo()['id']
}
}
var ProductSaverSettings = new Abstract.ProductSaverSettings()



function ProductSaver()
{
	this.divId=null;
	this.saveId=null;
	this.price=null;
	this.imgPrefix=null;
	this.brand=null;
	this.itemSaveOccasionId=null;
	this.itemSavePurchaseForId=null;
	this.userLoginOrJoin = false;
	this.containingPopupName=null;
	this.saveCallback=null;


	//this is the entry point for the product saver popup
	this.offerToSave=function(divId, saveId, price, imgPrefix, brand, callback) 
	{

		this.divId=divId;
		this.saveId=saveId;
		this.price=price;
		this.imgPrefix=imgPrefix;
		this.brand=brand;
		this.saveMode();
		if(typeof(callback)!='undefined')
			this.saveCallback=callback;	

	}
	//saveMode decides what information the save box should display                
	this.saveMode=function()
	{
		if (this.saveId)
		{

			if (this.divId != null) 
				ProductSaverSettings.onBeginSave()
				this.setUp()
				if($('messageDiv').style.display != 'none')
				{
					$('ps_formDiv').style.display='block';
					$('messageDiv').style.display='none';
				}


			if(!isLoggedIn) 
			{
				this.showLoginJoinOffer()
			}
			else
			{
				this._offerToSave()
			}
		}
		else (this.closeSave())

	}

	this._offerToSave = function () 
	{
		this.ps_showSave();
		if (partnerId == "personalshopper") {
			this.loadSaveOccasionForRecip()
		} else {
			this.doSave();
			this.closeSave();
		}
	}

	this.ps_showSave = function ()
	{
		var html = this.getSaveHTML()
		var formDiv = $("ps_formDiv")
		formDiv.innerHTML = html
	}  


	//this function is called to initilize the box creating most of the html formatting
	this.setUp=function()
	{
		if( SavePopup.isDisplayed() )
			SavePopup.hide()

			this.containingPopupName=SavePopup.popup.popupName

			var html = ''
			+'<table id=ps_outerdiv style="font:Arial;text-align:center;background:white;width:405px;height:160px;">'
			+'  <tr>'
			+'    <td style="width: 140px; height: 160px; border-right: 1px solid #6B9CCE; vertical-align: middle;">'
			+       this.createProductImgDiv()
			+'    </td>'
			+'    <td style="height: 160px; vertical-align: middle;">'
			+       this.createFormDiv()
			+'    </td>'
			+'  </tr>'
			+'</table>'
			SavePopup.oneShot(this.divId, html)
	}

//	This function forms the product image div
	this.createProductImgDiv=function ()
	{
		this.checkImgPrefixForSize();
		var imageS = this.imgPrefix;
		if (location.href.startsWith("https:") && imageS.startsWith("http:")) {
			imageS="https" + imageS.substring(4);
		}

		var html = ''
			+'<div id="ps_productDiv" style="text-align: center; margin-right: 10px;">'
			+'	<span id="savedPopupProductId" style="display:none">'
			+		this.saveId //this is for being checking the popup is up and being able to get back to it after a login. Used in returnURLManager.js
			+'	</span>'
			+'  save product<br>'
			+'  <img src="' + imageS + '110x120.jpg" ><br>'
			+   this.brand + '<br>'
			+'</div>'
			return html;
	}
	//this is a little utility function to trim off the size suffix on the image url if it is present                          
	this.checkImgPrefixForSize=function()
	{
		this.imgPrefix=this.imgPrefix.trim();
		if(this.imgPrefix.substring(this.imgPrefix.length-4,this.imgPrefix.length)=='.jpg' && this.imgPrefix.lastIndexOf('_')>=0)
			this.imgPrefix=this.imgPrefix.substring(0,this.imgPrefix.lastIndexOf('_')+1)
	}                            


	//This function creates the div for the form on the right hand side of the product saver
	this.createFormDiv=function ()
	{
		var html ='<div id="ps_formDiv">'
			+'</div><div id="messageDiv" style="display:none"></div>'
			return html
	}                                 

	//This function forms the HTML of the sign up form for a non logged in user when they click on an item to save it.
	this.showLoginJoinOffer = function ()   
	{
		var formDiv=$("ps_formDiv")
		var html='We\'re happy to save this item.  Please take a few minutes to tell us about yourself so we can save it for you. <a href="javascript:redirectToLogin();">Login</a> or <a href="javascript:redirectToJoin();">Join Now</a>.  '
			formDiv.innerHTML=html

	}

	this.ps_switchToAnything = function (callback,contents)
	{
		var formDiv = $("ps_formDiv")
		formDiv.innerHTML=contents
		setTimeout(callback,1000)
	}

	//Upon selecting a recipient this function populates the appropriate occasions int the occasions drop down
	this.loadSaveOccasionForRecip = function () 
	{
		var recipSaveSelect = $('recipSaveSelect')
		var occSaveSelect = $('occSaveSelect')
		var recipId = getSelectedValue(recipSaveSelect)
		clearSelect('occSaveSelect')

		if(recipId == 0) {
			occSaveSelect.style.display = 'none'
		} else {
			occSaveSelect.style.display = 'inline'
				//put the right occasions in the drop down
				for(var i=0; i<recipOccPairs.length; i++) {
					if(recipOccPairs[i].recipId == recipId) {
						if(recipOccPairs[i].occName == '') continue
						occSaveSelect.options[occSaveSelect.options.length] = 
							new Option(recipOccPairs[i].occName, recipOccPairs[i].occId)
					}
				}
			ProductSaverSettings.chooseDefaultOccasion()
		}
	}


	//this fuction will save an item
	this.doSave = function () 
	{

		this.itemSaveOccasionId=getSelectedValue($('occSaveSelect'));
		this.itemSavePurchaseForId=getSelectedValue($('recipSaveSelect'));
		this.ps_switchToAnything(doNothing,'<br><br>saving product...')
		if(this.itemSavePurchaseForId == 0) {
			importXML('/jsp/do/saveProduct.jsp?productId=' + this.saveId, this.userLoginOrJoin?this.forceReload.bind(this):this.closeSave.bind(this))
		} else {
			importXML('/jsp/do/saveProduct.jsp?productId=' + this.saveId + '&id=' + this.itemSaveOccasionId, this.userLoginOrJoin?this.forceReload.bind(this):this.closeSave.bind(this))
		}


		// SiteCatalyst-->
		LogSaveItem(this.saveId, this.price)
		// End SiteCatalyst -->
	} 
	this.forceReload = function ()
	{
		if(this.saveCallback!=null)
			this.saveCallback()
			window.location=window.location.href
	}           
	this.closeSave = function (callback) 
	{  
		ProductSaverSettings.onFinishSave()
		SavePopup.hide(callback)
		if(this.saveCallback!=null) {
			this.saveCallback()
		}
		if (partnerId == "personalshopper") {
			notifySavedItemsBox(this.itemSavePurchaseForId, this.itemSaveOccasionId)
		} else {
			updateDisplay();
		}		
			
	}



	//This function forms the HTML for the save popup box for a logged in user
	this.getSaveHTML = function () 
	{

		if(this.userLoginOrJoin)
		{
			var closeButton=$('FancyPopup_closer')
			if(closeButton)
				closeButton.setAttribute('onClick','window.location=window.location.href')
		}


		var divHtml = '<div style="width:159px;margin: 0 auto;background:white;text-align:left;">' 

			divHtml += '<div style="font:500 12pt Arial, sans-serif;margin-top:5px;">Save this item for...</div>'
				+  '<div id="selectsDiv" style="font:100 11pt Arial, sans-serif;">'
				+  '<select id="recipSaveSelect" style="width:159px;margin-top:5px;" onChange="ProductSaver.loadSaveOccasionForRecip()">'
				+  '<option value="0">Myself</option>'

				var recipId = ProductSaverSettings.recipientInfoSource()

				if (ProductSaverSettings.personJustSaved) recipId = -1

				var lastName = ''
				for(var i=0; i<recipOccPairs.length; i++) {
					if(lastName != recipOccPairs[i].recipName) {
						divHtml += '<option value="' + recipOccPairs[i].recipId 
						+ '" ' + ((recipId==recipOccPairs[i].recipId || ProductSaverSettings.personJustSaved==recipOccPairs[i].recipName)?'SELECTED':' ') + '>' 
						+ recipOccPairs[i].recipName + '</option>'
						lastName = recipOccPairs[i].recipName
					}
				}
		ProductSaverSettings.personJustSaved = false

		divHtml += '</select><br />'
			divHtml += '<select id="occSaveSelect" style="width:159px;margin-top:5px;"></select></div>' // end selectsDiv

				if(ProductSaverSettings.canAddRecips) {
					divHtml += '<div  style="font:100 9pt Arial, sans-serif;color:#5555ff;text-align:right;margin-top:5px;width=159px;">' 
						+ '<a href="javascript:ProductSaver.offerToCreateNewRecipient();" >'
						+ 'add recipient</a></div>'
				}
		var staticServerName = staticServer;
		if (location.href.startsWith("https:") && staticServerName.startsWith("http:")) {
			staticServerName="https" + staticServerName.substring(4);
		}

		divHtml += '<div style="margin-top:10px;text-align:center;width=159px;">' 
			+  '<a href="javascript:ProductSaver.doSave();">' 
			+  '<img align="center" src= "'+staticServerName+'/images/mystore/Save.gif" border="0"></a></div>'

			divHtml += '</div>'  //end outermost div
				return divHtml
	}


	this.clearStartValue = function (toClear, startValue)
	{
		var text = $(toClear).value;
		if( text == startValue ){
			$(toClear).value = "";
		}
	}

	this.restoreStartValue = function (toRestore, startValue)
	{
		var text = $(toRestore).value;
		if( text == ""){
			$(toRestore).value = startValue;
		}
	}

	this.offerToCreateNewRecipient = function () 
	{	
		var staticServerName = staticServer;
		if (location.href.startsWith("https:") && staticServerName.startsWith("http:")) {
			staticServerName="https" + staticServerName.substring(4);
		}

		var divHtml = '<div style="width:210px;margin:0;padding:3px;background-color:white;">' 
			+ '<div style="width:100%;height:152px;margin:0;padding:0;">' 
			+ '<div style="text-align:left;font:500 12pt Arial, sans-serif;margin-left:15px;">Add Recipient</div>'
			+ '<div style="width:180px;margin:4px 15px 0 15px;font:100 8pt Arial,sans-serif;">'
			+ '<div><input style="width:180px;" type="text" id="ds_nickname" maxlength="25" name="ds_nickname" value="First name or nickname" class="vBlack8" onFocus="javascript:ProductSaver.clearStartValue(\'ds_nickname\',\'First name or nickname\');"'
			+ ' onBlur="javascript:ProductSaver.restoreStartValue(\'ds_nickname\',\'First name or nickname\');"></div>'
			+ '<div style="overflow:auto;margin:5px 0 5px 0;">'
			+ '<div align="left" style="width:50%;float:left;">'
			+ '<input onblur="ProductSaver.buildDynamicSaveRelationshipSelect(); ProductSaver.restoreStartValue(\'ds_age\',\'Age\')" onFocus="ProductSaver.clearStartValue(\'ds_age\',\'Age\')" type="text" style="width:53px;padding-left:3px;" class="vBlack8" name="ds_age" id="ds_age" onkeypress="return numbersonly(this, event)" value="Age" maxlength="3" size="3" /> yrs.'
			+ '</div>'
			+ '<form style="margin:0;padding:0;">'
			+ '<div style="width:25%;float:right;">'
			+ '<input onclick="ProductSaver.buildDynamicSaveRelationshipSelect()" type="radio" name="ds_gender" checked id="ds_gender_female" value="F" class="vBlack8"><label for="ds_gender_female">F</label>'
			+ '</div>'
			+ '<div style="width:25%;float:right;">'
			+ '<input onclick="ProductSaver.buildDynamicSaveRelationshipSelect()" type="radio" id="ds_gender_male" name="ds_gender" value="M" class="vBlack8"><label for="ds_gender_male">M</label>'
			+ '</div></form></div>'
			+ '<select name="ds_relationship" class="vBlack8" style="width:180px;" id="dynamicSaveRelationshipSelect">'
			+ '<OPTION value="0" selected>Relationship to you</OPTION>'
			+ '</select>'
			+ '<div style="overflow:auto;margin:5px 0 5px 0;">'
			+ '<div style="float:left;width:60%;" align="left">'
			+ '<select name="ds_birthmonth" id="ds_birthmonth" class="vBlack8" >'
			+ '<OPTION value="0" selected>Birth Month&nbsp;&nbsp;&nbsp;</OPTION><OPTION value="1" >January</OPTION><OPTION value="2" >February</OPTION><OPTION value="3" >March</OPTION><OPTION value="4" >April</OPTION><OPTION value="5" >May</OPTION><OPTION value="6" >June</OPTION><OPTION value="7" >July</OPTION><OPTION value="8" >August</OPTION><OPTION value="9" >September</OPTION><OPTION value="10" >October</OPTION><OPTION value="11" >November</OPTION><OPTION value="12" >December</OPTION>'
			+ '</select>'
			+ '</div><div style="float:left;width:40%;" align="right">'
			+ '<select name="ds_birthday" id="ds_birthday" class="vBlack8">'
			+ '<OPTION value="0" selected>Day</OPTION><OPTION value="1" >1</OPTION><OPTION value="2" >2</OPTION><OPTION value="3" >3</OPTION><OPTION value="4" >4</OPTION><OPTION value="5" >5</OPTION><OPTION value="6" >6</OPTION><OPTION value="7" >7</OPTION><OPTION value="8" >8</OPTION><OPTION value="9" >9</OPTION><OPTION value="10" >10</OPTION><OPTION value="11" >11</OPTION><OPTION value="12" >12</OPTION><OPTION value="13" >13</OPTION><OPTION value="14" >14</OPTION><OPTION value="15" >15</OPTION><OPTION value="16" >16</OPTION><OPTION value="17" >17</OPTION><OPTION value="18" >18</OPTION><OPTION value="19" >19</OPTION><OPTION value="20" >20</OPTION><OPTION value="21" >21</OPTION><OPTION value="22" >22</OPTION><OPTION value="23" >23</OPTION><OPTION value="24" >24</OPTION><OPTION value="25" >25</OPTION><OPTION value="26" >26</OPTION><OPTION value="27" >27</OPTION><OPTION value="28" >28</OPTION><OPTION value="29" >29</OPTION><OPTION value="30" >30</OPTION><OPTION value="31" >31</OPTION>'
			+ '</select></div>'
			+ '</div><div align="center"><a href="" id="cancelLink" style="color: rgb(85, 85, 255);">Cancel</a> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;'
			+ '<a href="javascript:ProductSaver.doDynamicRecipientSave();">'
			+'<img align="absmiddle" src="'+staticServerName+'/images/mystore/Save.gif" border="0"></a></div></div>'
			+ '</div>'
			+ '</div>'

			var formDiv = $('ps_formDiv')
			formDiv.innerHTML = divHtml

			var cancelLink=$('cancelLink')
			if (this.saveId)
				cancelLink.href="javascript:ProductSaver._offerToSave()"
					else
						cancelLink.href="javascript:ProductSaver.closeSave()"

							var closeButton=$(this.containingPopupName + "_closer");
		if(closeButton)
			closeButton.onclick=this.closeBeforeRecipientSave.bind(this);
		this.preselectDynamicRecipientSaver()
		this.buildDynamicSaveRelationshipSelect(false)
	}


	this.preselectDynamicRecipientSaver = function ()     
	{
		if(!isShoppingForHimHer())
			return
			var recip=null
			if(typeof(getRecipientInfo) == undefined)
				recip = getRecipientInfo()
				else
					recip={id : '0', name : 'Me'}
		if(recip['id']==-1)
			$('ds_gender_male').checked = true
			else
				$('ds_gender_female').checked = true
				$('ds_age').value = getCurrentShoppingForAge()
	}


	this.buildDynamicSaveRelationshipSelect = function (xmlDoc) 
	{
		if(!xmlDoc) {
			var url = '/jsp/xml/relationshipsByAgeGenderXML.jsp?realAge=true&'
				url += 'gender='
					if($('ds_gender_male').checked)
						url += 'M'
							else url += 'F'
								url += '&age=' + ($('ds_age').value)
								if(this.buildDynamicSaveRelationshipSelect.arguments.length == 0)
									importXML(url, this.buildDynamicSaveRelationshipSelect.bind(this))
									else
										importXML(url, this.initDynamicSaveRelationshipSelect.bind(this))
										return
		}
		if( ! $('dynamicSaveRelationshipSelect') ) {
			//perhaps the user closed it before the xml returned
			return
		}
		buildDropDown(xmlDoc, $('dynamicSaveRelationshipSelect'))
	}
	this.checkRecipFormModified = function()   
	{
		if($('ds_nickname').value!='First name or nickname' || $('ds_age').value!= 'Age' || $('dynamicSaveRelationshipSelect').selectedIndex != 0 || $('ds_birthmonth').selectedIndex != 0 || $('ds_birthday').selectedIndex != 0)
			return true; 
		else
			return false;
	}
	this.closeBeforeRecipientSave = function()
	{
		var recipFormModified=this.checkRecipFormModified()
		if(recipFormModified)
		{
			var answer=confirm("If you leave now your recipient information will not be saved. Do you wish to continue?");
			if(answer==1)
				SavePopup.popup.closeClick();
		}
		else
			SavePopup.popup.closeClick();
	}                                          
	this.buildDynamicSaveRelationshipSelectQS = function (xmlDoc) 
	{
		if(!xmlDoc) {
			var url = '/jsp/xml/relationshipsByAgeGenderXML.jsp?realAge=true&'
				url += 'gender='
					if($('ds_gender_male_qs').checked)
						url += 'M'
							else url += 'F'
								url += '&age=' + ($('ds_age_qs').value)
								importXML(url, this.buildDynamicSaveRelationshipSelectQS.bind(this))
								return
		}
		if( ! $('dynamicPBSaveRelationshipSelect') ) {
			//perhaps the user closed it before the xml returned
			return
		}
		buildDropDown(xmlDoc, $('dynamicPBSaveRelationshipSelect'))
	}

	this.initDynamicSaveRelationshipSelect = function (xmlDoc) 
	{
		buildDropDown(xmlDoc, $('dynamicSaveRelationshipSelect'))
		if(! $('relationshipSelect')) {
			return
		}
		var rel = getSelectedValue('relationshipSelect')
		var dynamicSaveRelationshipSelect = $('dynamicSaveRelationshipSelect')
		for(var i=0; i<dynamicSaveRelationshipSelect.options.length; i++)
			if(dynamicSaveRelationshipSelect.options[i].value == rel) {
				dynamicSaveRelationshipSelect.selectedIndex = i
				break
			}
	}


	this.doDynamicRecipientSave = function ()
	{
		var ds_nickname = $('ds_nickname')
		var ds_age = $('ds_age')
		var dsrs = $('dynamicSaveRelationshipSelect')
		var ds_birthmonth = $('ds_birthmonth')
		var ds_birthday = $('ds_birthday')

		var good = true

		if(ds_nickname.value == 'First name or nickname' || ds_nickname.value.isWhiteSpace()) {
			ds_nickname.style.backgroundColor = '#ffffaa'
				ds_nickname.style.borderStyle = 'groove'
					//ds_nickname.style.border = 'solid 1px #7F9DB9'
					//ds_nickname.style.height = '20px'
					//ds_nickname.style.padding = '1px'
					good = false
		} else {
			//ISSUE WWW-2459, VALIDATE THE USER'S NICKNAME OR FIRST NAME (allows special characters @ _ . only)          
			for(var j=0; j<ds_nickname.value.length; j++)
			{
				var alphaa = ds_nickname.value.charAt(j);
				var hh = alphaa.charCodeAt(0);
				if((hh > 47 && hh<59) || (hh > 63 && hh<91) || (hh > 96 && hh<123) || hh == 95 || hh == 46 || hh==32)

				{

					ds_nickname.style.backgroundColor = ''
					ds_nickname.style.borderStyle = ''
				}

				else  {
					alert("Sorry, only alphanumeric values, spaces, underscores (_), AT symbol (@) and a dot (.) are allowed for \n"+ "First name or nickname ");
					return;
				}
			}

			//ds_nickname.style.backgroundColor = ''
			//ds_nickname.style.borderStyle = ''
			//ds_nickname.style.border = 'solid 1px #7F9DB9'
		}
		if(ds_age.value == 'Age' || ds_age.value.isWhiteSpace() || parseInt(ds_age.value) > 110) {
			ds_age.style.backgroundColor = '#ffffaa'
				ds_age.style.borderStyle = 'groove'
					//ds_age.style.border = 'solid 1px #7F9DB9'
					//ds_age.style.height = '20px'
					//ds_age.style.padding = '1px'
					good = false
		} else {
			ds_age.style.backgroundColor = ''
				ds_age.style.borderStyle = ''
					//ds_age.style.border = 'solid 1px #7F9DB9'
		}
		if(dsrs.selectedIndex == 0) {
			dsrs.style.backgroundColor = '#ffffaa'
				dsrs.style.borderStyle = 'groove'
					//dsrs.style.border = 'solid 1px #7F9DB9'
					good = false
		} else {
			dsrs.style.backgroundColor = ''
				dsrs.style.borderStyle = ''
					//dsrs.style.border = 'solid 1px #7F9DB9'
		}
		if(ds_birthmonth.selectedIndex == 0) {
			ds_birthmonth.style.backgroundColor = '#ffffaa'
				ds_birthmonth.style.borderStyle = 'groove'
					//ds_birthmonth.style.border = 'solid 1px #7F9DB9'
					good = false
		} else {
			ds_birthmonth.style.backgroundColor = ''
				ds_birthmonth.style.borderStyle = ''
					//ds_birthmonth.style.border = 'solid 1px #7F9DB9'
		}
		if(ds_birthday.selectedIndex == 0) {
			ds_birthday.style.backgroundColor = '#ffffaa'
				ds_birthday.style.borderStyle = 'groove'
					//ds_birthday.style.border = 'solid 1px #7F9DB9'
					good = false
		} else {
			ds_birthday.style.backgroundColor = ''
				ds_birthday.style.borderStyle = ''
					//ds_birthday.style.border = 'solid 1px #7F9DB9'
		}
		if(!good)
			return
			ProductSaverSettings.personJustSaved = ds_nickname.value
			var url = '/jsp/xml/addRecipientXML.jsp?'
				+ 'nickname=' + ds_nickname.value + '&'
				+ 'gender=' + (($('ds_gender_male').checked)?'M':'F') + '&'
				+ 'age=' + ds_age.value + '&'
				+ 'relationship=' + getSelectedValue(dsrs) + '&'
				+ 'birthMonth=' + getSelectedValue(ds_birthmonth) + '&'
				+ 'birthDay=' + getSelectedValue(ds_birthday)

				importXML(url, this.cleanUpSaveRecipientProcess.bind(this))
				var divHtml= '<div style="width:210px;margin:0;padding:3px;background-color:white;">' 
					+ '<div style="width:100%;height:152px;margin:0;padding:0;">' 
					+ '<br />Saving recipient.<br />Please wait...</div></div>'

					SavePopup.onClickOff = ProductSaverSettings.onClickOffLoad
					this.ps_switchToAnything(doNothing,divHtml)

	}   


	this.cleanUpSaveRecipientProcess = function (xmlDoc) 
	{
		setRecipOccPairsDoneAction = this.reOfferToSave.bind(this);

		if(isShoppingForHimHer())
			this.saveNewShoppingForState(xmlDoc)
			recipOccPairs = new Array()
		setRecipOccPairs()
	}

	this.reOfferToSave = function () 
	{
		newRecipReloadRequired = true
		setRecipOccPairsDoneAction = ''
		SavePopup.onClickOff = ProductSaverSettings.onClickOffSave
		this._offerToSave()
	}


	this.saveNewShoppingForState = function (xmlDoc)
	{
		var recipElems = xmlDoc.getElementsByTagName('recipient')
		var recipId = getAttribute(recipElems[0], 'id')
		var occId = 0
		if($('occasionSelect'))
			occId = getSelectedValue($('occasionSelect'))
			var url = '/jsp/xml/saveShoppingForState.jsp?recipient=' + recipId
			+ '&age=0'
			+ '&relation=0'
			+ '&occasion=' + occId

			importXML(url, doNothing)
	}                        



}


var ProductSaver = new ProductSaver()


/*************************************************************/
/***** Common requests for information ***********************/
function isShoppingForHimHer() {
	try {
		return shoppingForInfo.isShoppingForHimHer()
	} catch (e) { return false /* sometimes that fails for some reason */ }
}

function isShoppingForMe() {
	try {
		return shoppingForInfo.isShoppingForMe()
	} catch (e) { return true /* sometimes that fails for some reason */ }
}

function parseAndPlaceKeyword(str) {
	//no parsing needed
	setKeywordSearch(str)
}
function parseAndPlaceBudget(str) {
	//$xxxx - $xxxx
	var space = str.indexOf(' ')
	var dollar = str.lastIndexOf('$')
	var dollarcheck = str.indexOf('$')
	var low = str.substring(1,space)
	var high = str.substring(dollar+1)
	if(dollar == dollarcheck) {
		low = ''
		high = ''
	}
	setBudgetLow(low)
	setBudgetHigh(high)
}


var recipOccPairs = new Array()



function setRecipOccPairs(xmlDoc) {
	if(recipOccPairs.length > 0)
		return
	
	if(!xmlDoc) {
		var url = '/jsp/xml/calendarOccasionsXML.jsp'
		importXML(url, setRecipOccPairs)
		return
	}
	
	if( xmlDoc.documentElement && xmlDoc.documentElement.tagName && xmlDoc.documentElement.tagName.toUpperCase() == 'HTML' ) {
		setTimeout('alert(\'Calendar import failed.\');',50); return;
	}
	
	//get the recipient elements
	var recipElems = xmlDoc.getElementsByTagName('recipient')

	for(var i=0; i<recipElems.length; i++) {
		var recipId = getAttribute(recipElems[i], 'id')
		var recipName = ''
		var occId = ''
		var occName = ''
		
		for(var j=0; j<recipElems[i].childNodes.length; j++) {
			if (recipElems[i].childNodes[j].nodeType != 1) continue

			var tagName = recipElems[i].childNodes[j].nodeName.toLowerCase()
			if(tagName == 'name') {
				recipName = getText(recipElems[i].childNodes[j])
			} else if(tagName == 'occasion') {
				occId = getAttribute(recipElems[i].childNodes[j], 'id')
				occName = getText(recipElems[i].childNodes[j])
			}
			var currentIndex = recipOccPairs.length
			recipOccPairs[currentIndex] = new Array()
			recipOccPairs[currentIndex]['recipId'] = recipId
			recipOccPairs[currentIndex]['recipName'] = recipName
			recipOccPairs[currentIndex]['occId'] = occId
			recipOccPairs[currentIndex]['occName'] = occName
		}
	}
	setRecipOccPairsDone()
}
//setRecipOccPairs()



function getCurrentShoppingForAgeInYears() {
	var ageVal = ddAges.getSelectedLabel()
	ageParts = ageVal.split('-')
	
	for(var i=0; i<ageParts.length; i++) {
		ageParts[i] = ageParts[i].trim()
	}
	
	if(ageVal.indexOf('mo.') >= 0) {
		for(var i=0; i<ageParts.length; i++) {
			try {
				ageParts[i] = parseFloat(ageParts[i]) / 12.0
			} catch (e) { ageParts[i] = 0 }
		}
	}
	
	if(ageParts.length == 1)
		return ageParts[0]
	else
		try { return Math.round((parseFloat(ageParts[0]) + parseFloat(ageParts[1])) / 2) }
		catch(e) { return 'Age' }
}



var setRecipOccPairsDoneAction = 'doNothing'
function setRecipOccPairsDone() {
	if (setRecipOccPairsDoneAction instanceof Function)
		setRecipOccPairsDoneAction();
	else eval(setRecipOccPairsDoneAction + '()')
}




/* SiteCatalyst
Copyright 1997-2006 Omniture, Inc. More info available at
http://www.omniture.com */
/* Specify the Report Suite ID(s) to track here */

var s_account = "";
var domain = document.domain.toLowerCase();
if (domain == "pstest.personalshopper.com") {
    s_account = "personalshoppercomdev2"; //This is our Test suite --> Site: Personal Shopper - Test
}
else if (domain == "shop.personalshopper.com") {
    s_account = "personalshoppercomdev";        // development account for personalshopper
}
else if (domain == "www.personalshopper.com" || domain == "personalshopper.com") {
    s_account = "personalshoppercom";  //This is our Production suite --> Site: Personal Shopper - Production
}
else if (domain == "test.shopoholic.com") {
    s_account = "personalshoppercomoxygentest"; // Test account for shopoholic   
}
else if (domain == "shop.shopoholic.com") {
    s_account = "personalshoppercomoxygendev";  // development account for shopoholic
}
else if (domain == "www.shopoholic.com" || domain == "shopoholic.com") {
    s_account = "personalshoppercomoxygenprod"; // production account for shopoholic   
}
else {
    // none of the above, assume ps development
    s_account = "personalshoppercomdev";
}

var s=s_gi(s_account)

try{ 
	s.server=servername;
}
catch (e) {
}


/************************** CONFIG SECTION **************************/
/* You may add or alter any code config here. */
/* Link Tracking Config */
s.trackDownloadLinks=true
s.trackExternalLinks=true
s.trackInlineStats=true
s.linkDownloadFileTypes="exe,zip,wav,mp3,mov,mpg,avi,wmv,doc,pdf,xls"
s.linkInternalFilters="javascript:,.,/"
s.linkLeaveQueryString=false
//s.linkTrackVars="None"
//s.linkTrackEvents="None"

/* WARNING: Changing the visitor namespace will cause drastic changes
to how your visitor data is collected.  Changes should only be made
when instructed to do so by your account manager.*/
s.visitorNamespace="personalshopper"

/* Plugin Config */
s.usePlugins=true
function s_doPlugins(s) {
    s.campaign=s.getQueryParam("adCode")
    s.eVar7=s.getQueryParam("SilverpopUserID")
}

s.doPlugins=s_doPlugins

/*
 * Plugin: getNewRepeat 1.0 - Return whether user is new or repeat
 */
s.getNewRepeat=new Function(""
+"var s=this,e=new Date(),cval,ct=e.getTime(),y=e.getYear();e.setTime"
+"(ct+30*24*60*60*1000);cval=s.c_r('s_nr');if(cval.length==0){s.c_w("
+"'s_nr',ct,e);return 'New';}if(cval.length!=0&&ct-cval<30*60*1000){s"
+".c_w('s_nr',ct,e);return 'New';}if(cval<1123916400001){e.setTime(cv"
+"al+30*24*60*60*1000);s.c_w('s_nr',ct,e);return 'Repeat';}else retur"
+"n 'Repeat';");

/* 
 * Plugin: getQueryParam 2.1 - return query string parameter(s) 
 */ 
s.getQueryParam=new Function("p","d","u","" 
+"var s=this,v='',i,t;d=d?d:'';u=u?u:(s.pageURL?s.pageURL:s.wd.locati" 
+"on);if(u=='f')u=s.gtfs().location;while(p){i=p.indexOf(',');i=i<0?p" 
+".length:i;t=s.p_gpv(p.substring(0,i),u+'');if(t)v+=v?d+t:t;p=p.subs" 
+"tring(i==p.length?i:i+1)}return v"); 
s.p_gpv=new Function("k","u","" 
+"var s=this,v='',i=u.indexOf('?'),q;if(k&&i>-1){q=u.substring(i+1);v" 
+"=s.pt(q,'&','p_gvf',k)}return v"); 
s.p_gvf=new Function("t","k","" 
+"if(t){var s=this,i=t.indexOf('='),p=i<0?t:t.substring(0,i),v=i<0?'T" 
+"rue':t.substring(i+1);if(p.toLowerCase()==k.toLowerCase())return s." 
+"epa(v)}return ''"); 

/******************************************************************** 
 * 
 * Commented example of how to use this is doPlugins function 
 * 
 *******************************************************************/ 
/* Plugin Example: getQueryParam 2.1 
//single parameter 
s.campaign=s.getQueryParam('cid'); 

//multiple parameters 
s.campaign=s.getQueryParam('cid,sid',':'); 

//non-page URL example 
s.campaign=s.getQueryParam('cid','',document.referrer); 

//parent frame example 
s.campaign=s.getQueryParam('cid','','f'); 

*/ 


/************* DO NOT ALTER ANYTHING BELOW THIS LINE ! **************/
var s_objectID;function s_c2fe(f){var x='',s=0,e,a,b,c;while(1){e=
f.indexOf('"',s);b=f.indexOf('\\',s);c=f.indexOf("\n",s);if(e<0||(b>=
0&&b<e))e=b;if(e<0||(c>=0&&c<e))e=c;if(e>=0){x+=(e>s?f.substring(s,e):
'')+(e==c?'\\n':'\\'+f.substring(e,e+1));s=e+1}else return x
+f.substring(s)}return f}function s_c2fa(f){var s=f.indexOf('(')+1,e=
f.indexOf(')'),a='',c;while(s>=0&&s<e){c=f.substring(s,s+1);if(c==',')
a+='","';else if(("\n\r\t ").indexOf(c)<0)a+=c;s++}return a?'"'+a+'"':
a}function s_c2f(cc){cc=''+cc;var fc='var f=new Function(',s=
cc.indexOf(';',cc.indexOf('{')),e=cc.lastIndexOf('}'),o,a,d,q,c,f,h,x
fc+=s_c2fa(cc)+',"var s=new Object;';c=cc.substring(s+1,e);s=
c.indexOf('function');while(s>=0){d=1;q='';x=0;f=c.substring(s);a=
s_c2fa(f);e=o=c.indexOf('{',s);e++;while(d>0){h=c.substring(e,e+1);if(
q){if(h==q&&!x)q='';if(h=='\\')x=x?0:1;else x=0}else{if(h=='"'||h=="'"
)q=h;if(h=='{')d++;if(h=='}')d--}if(d>0)e++}c=c.substring(0,s)
+'new Function('+(a?a+',':'')+'"'+s_c2fe(c.substring(o+1,e))+'")'
+c.substring(e+1);s=c.indexOf('function')}fc+=s_c2fe(c)+';return s");'
eval(fc);return f}function s_gi(un,pg,ss){var c="function s_c(un,pg,s"
+"s){var s=this;s.wd=window;if(!s.wd.s_c_in){s.wd.s_c_il=new Array;s."
+"wd.s_c_in=0;}s._il=s.wd.s_c_il;s._in=s.wd.s_c_in;s._il[s._in]=s;s.w"
+"d.s_c_in++;s.m=function(m){return (''+m).indexOf('{')<0};s.fl=funct"
+"ion(x,l){return x?(''+x).substring(0,l):x};s.co=function(o){if(!o)r"
+"eturn o;var n=new Object,x;for(x in o)if(x.indexOf('select')<0&&x.i"
+"ndexOf('filter')<0)n[x]=o[x];return n};s.num=function(x){x=''+x;for"
+"(var p=0;p<x.length;p++)if(('0123456789').indexOf(x.substring(p,p+1"
+"))<0)return 0;return 1};s.rep=function(x,o,n){var i=x.indexOf(o),l="
+"n.length>0?n.length:1;while(x&&i>=0){x=x.substring(0,i)+n+x.substri"
+"ng(i+o.length);i=x.indexOf(o,i+l)}return x};s.ape=function(x){var s"
+"=this,i;x=x?s.rep(escape(''+x),'+','%2B'):x;if(x&&s.charSet&&s.em=="
+"1&&x.indexOf('%u')<0&&x.indexOf('%U')<0){i=x.indexOf('%');while(i>="
+"0){i++;if(('89ABCDEFabcdef').indexOf(x.substring(i,i+1))>=0)return "
+"x.substring(0,i)+'u00'+x.substring(i);i=x.indexOf('%',i)}}return x}"
+";s.epa=function(x){var s=this;return x?unescape(s.rep(''+x,'+',' ')"
+"):x};s.pt=function(x,d,f,a){var s=this,t=x,z=0,y,r;while(t){y=t.ind"
+"exOf(d);y=y<0?t.length:y;t=t.substring(0,y);r=s.m(f)?s[f](t,a):f(t,"
+"a);if(r)return r;z+=y+d.length;t=x.substring(z,x.length);t=z<x.leng"
+"th?t:''}return ''};s.isf=function(t,a){var c=a.indexOf(':');if(c>=0"
+")a=a.substring(0,c);if(t.substring(0,2)=='s_')t=t.substring(2);retu"
+"rn (t!=''&&t==a)};s.fsf=function(t,a){var s=this;if(s.pt(a,',','isf"
+"',t))s.fsg+=(s.fsg!=''?',':'')+t;return 0};s.fs=function(x,f){var s"
+"=this;s.fsg='';s.pt(x,',','fsf',f);return s.fsg};s.c_d='';s.c_gdf=f"
+"unction(t,a){var s=this;if(!s.num(t))return 1;return 0};s.c_gd=func"
+"tion(){var s=this,d=s.wd.location.hostname,n=s.fpCookieDomainPeriod"
+"s,p;if(!n)n=s.cookieDomainPeriods;if(d&&!s.c_d){n=n?parseInt(n):2;n"
+"=n>2?n:2;p=d.lastIndexOf('.');while(p>=0&&n>1){p=d.lastIndexOf('.',"
+"p-1);n--}s.c_d=p>0&&s.pt(d,'.','c_gdf',0)?d.substring(p):''}return "
+"s.c_d};s.c_r=function(k){var s=this;k=s.ape(k);var c=' '+s.d.cookie"
+",i=c.indexOf(' '+k+'='),e=i<0?i:c.indexOf(';',i),v=i<0?'':s.epa(c.s"
+"ubstring(i+2+k.length,e<0?c.length:e));return v!='[[B]]'?v:''};s.c_"
+"w=function(k,v,e){var s=this,d=s.c_gd(),l=s.cookieLifetime,t;v=''+v"
+";l=l?(''+l).toUpperCase():'';if(e&&l!='SESSION'&&l!='NONE'){t=(v!='"
+"'?parseInt(l?l:0):-60);if(t){e=new Date;e.setTime(e.getTime()+(t*10"
+"00))}}if(k&&l!='NONE'){s.d.cookie=k+'='+s.ape(v!=''?v:'[[B]]')+'; p"
+"ath=/;'+(e&&l!='SESSION'?' expires='+e.toGMTString()+';':'')+(d?' d"
+"omain='+d+';':'');return s.c_r(k)==v}return 0};s.eh=function(o,e,r,"
+"f){var s=this,b='s_'+e+'_'+s._in,n=-1,l,i,x;if(!s.ehl)s.ehl=new Arr"
+"ay;l=s.ehl;for(i=0;i<l.length&&n<0;i++){if(l[i].o==o&&l[i].e==e)n=i"
+"}if(n<0){n=i;l[n]=new Object}x=l[n];x.o=o;x.e=e;f=r?x.b:f;if(r||f){"
+"x.b=r?0:o[e];x.o[e]=f}if(x.b){x.o[b]=x.b;return b}return 0};s.cet=f"
+"unction(f,a,t,o,b){var s=this,r;if(s.apv>=5&&(!s.isopera||s.apv>=7)"
+")eval('try{r=s.m(f)?s[f](a):f(a)}catch(e){r=s.m(t)?s[t](e):t(e)}');"
+"else{if(s.ismac&&s.u.indexOf('MSIE 4')>=0)r=s.m(b)?s[b](a):b(a);els"
+"e{s.eh(s.wd,'onerror',0,o);r=s.m(f)?s[f](a):f(a);s.eh(s.wd,'onerror"
+"',1)}}return r};s.gtfset=function(e){var s=this;return s.tfs};s.gtf"
+"soe=new Function('e','var s=s_c_il['+s._in+'];s.eh(window,\"onerror"
+"\",1);s.etfs=1;var c=s.t();if(c)s.d.write(c);s.etfs=0;return true')"
+";s.gtfsfb=function(a){return window};s.gtfsf=function(w){var s=this"
+",p=w.parent,l=w.location;s.tfs=w;if(p&&p.location!=l&&p.location.ho"
+"st==l.host){s.tfs=p;return s.gtfsf(s.tfs)}return s.tfs};s.gtfs=func"
+"tion(){var s=this;if(!s.tfs){s.tfs=s.wd;if(!s.etfs)s.tfs=s.cet('gtf"
+"sf',s.tfs,'gtfset',s.gtfsoe,'gtfsfb')}return s.tfs};s.ca=function()"
+"{var s=this,imn='s_i_'+s.fun;if(s.d.images&&s.apv>=3&&(!s.isopera||"
+"s.apv>=7)&&(s.ns6<0||s.apv>=6.1)){s.ios=1;if(!s.d.images[imn]&&(!s."
+"isns||(s.apv<4||s.apv>=5))){s.d.write('<im'+'g name=\"'+imn+'\" hei"
+"ght=1 width=1 border=0 alt=\"\">');if(!s.d.images[imn])s.ios=0}}};s"
+".mr=function(sess,q,ta){var s=this,ns=s.visitorNamespace,unc=s.rep("
+"s.fun,'_','-'),imn='s_i_'+s.fun,im,b,e,rs='http'+(s.ssl?'s':'')+':/"
+"/'+(s.ssl?'metrics':'metric')+'.personalshopper.com/b/ss/'+s.un+'/1/H.4-pdv-"
+"2/'+sess+'?[AQB]&ndh=1'+(q?q:'')+(s.q?s.q:'')+'&[AQE]';if(s.isie&&!"
+"s.ismac){if(s.apv>5.5)rs=s.fl(rs,4095);else rs=s.fl(rs,2047)}if(s.i"
+"os){if (!s.ss)s.ca();im=s.wd[imn]?s.wd[imn]:s.d.images[imn];if(!im)"
+"im=s.wd[imn]=new Image;im.src=rs;if(rs.indexOf('&pe=')>=0&&(!ta||ta"
+"=='_self'||ta=='_top'||(s.wd.name&&ta==s.wd.name))){b=e=new Date;wh"
+"ile(e.getTime()-b.getTime()<500)e=new Date}return ''}return '<im'+'"
+"g sr'+'c=\"'+rs+'\" width=1 height=1 border=0 alt=\"\">'};s.gg=func"
+"tion(v){var s=this;return s.wd['s_'+v]};s.glf=function(t,a){if(t.su"
+"bstring(0,2)=='s_')t=t.substring(2);var s=this,v=s.gg(t);if(v)s[t]="
+"v};s.gl=function(v){var s=this;s.pt(v,',','glf',0)};s.gv=function(v"
+"){var s=this;return s['vpm_'+v]?s['vpv_'+v]:(s[v]?s[v]:'')};s.havf="
+"function(t,a){var s=this,b=t.substring(0,4),x=t.substring(4),n=pars"
+"eInt(x),k='g_'+t,m='vpm_'+t,q=t,v=s.linkTrackVars,e=s.linkTrackEven"
+"ts;s[k]=s.gv(t);if(s.lnk||s.eo){v=v?v+','+s.vl_l:'';if(v&&!s.pt(v,'"
+",','isf',t))s[k]='';if(t=='events'&&e)s[k]=s.fs(s[k],e)}s[m]=0;if(t"
+"=='pageURL')q='g';else if(t=='referrer')q='r';else if(t=='vmk')q='v"
+"mt';else if(t=='charSet'){q='ce';if(s[k]&&s.em==2)s[k]='UTF-8'}else"
+" if(t=='visitorNamespace')q='ns';else if(t=='cookieDomainPeriods')q"
+"='cdp';else if(t=='cookieLifetime')q='cl';else if(t=='variableProvi"
+"der')q='vvp';else if(t=='currencyCode')q='cc';else if(t=='channel')"
+"q='ch';else if(t=='campaign')q='v0';else if(s.num(x)) {if(b=='prop'"
+")q='c'+n;else if(b=='eVar')q='v'+n;else if(b=='hier'){q='h'+n;s[k]="
+"s.fl(s[k],255)}}if(s[k]&&t!='linkName'&&t!='linkType')s.qav+='&'+q+"
+"'='+s.ape(s[k]);return ''};s.hav=function(){var s=this;s.qav='';s.p"
+"t(s.vl_t,',','havf',0);return s.qav};s.lnf=function(t,h){t=t?t.toLo"
+"werCase():'';h=h?h.toLowerCase():'';var te=t.indexOf('=');if(t&&te>"
+"0&&h.indexOf(t.substring(te+1))>=0)return t.substring(0,te);return "
+"''};s.ln=function(h){var s=this,n=s.linkNames;if(n)return s.pt(n,',"
+"','lnf',h);return ''};s.ltdf=function(t,h){t=t?t.toLowerCase():'';h"
+"=h?h.toLowerCase():'';var qi=h.indexOf('?');h=qi>=0?h.substring(0,q"
+"i):h;if(t&&h.substring(h.length-(t.length+1))=='.'+t)return 1;retur"
+"n 0};s.ltef=function(t,h){t=t?t.toLowerCase():'';h=h?h.toLowerCase("
+"):'';if(t&&h.indexOf(t)>=0)return 1;return 0};s.lt=function(h){var "
+"s=this,lft=s.linkDownloadFileTypes,lef=s.linkExternalFilters,lif=s."
+"linkInternalFilters;lif=lif?lif:s.wd.location.hostname;h=h.toLowerC"
+"ase();if(s.trackDownloadLinks&&lft&&s.pt(lft,',','ltdf',h))return '"
+"d';if(s.trackExternalLinks&&(lef||lif)&&(!lef||s.pt(lef,',','ltef',"
+"h))&&(!lif||!s.pt(lif,',','ltef',h)))return 'e';return ''};s.lc=new"
+" Function('e','var s=s_c_il['+s._in+'],b=s.eh(this,\"onclick\");s.l"
+"nk=s.co(this);s.t();s.lnk=0;if(b)return this[b](e);return true');s."
+"bc=new Function('e','var s=s_c_il['+s._in+'],f;if(s.d&&s.d.all&&s.d"
+".all.cppXYctnr)return;s.eo=e.srcElement?e.srcElement:e.target;eval("
+"\"try{if(s.eo&&(s.eo.tagName||s.eo.parentElement||s.eo.parentNode))"
+"s.t()}catch(f){}\");s.eo=0');s.ot=function(o){var a=o.type,b=o.tagN"
+"ame;return (a&&a.toUpperCase?a:b&&b.toUpperCase?b:o.href?'A':'').to"
+"UpperCase()};s.oid=function(o){var s=this,t=s.ot(o),p=o.protocol,c="
+"o.onclick,n='',x=0;if(!o.s_oid){if(o.href&&(t=='A'||t=='AREA')&&(!c"
+"||!p||p.toLowerCase().indexOf('javascript')<0))n=o.href;else if(c){"
+"n=s.rep(s.rep(s.rep(s.rep(''+c,\"\\r\",''),\"\\n\",''),\"\\t\",''),"
+"' ','');x=2}else if(o.value&&(t=='INPUT'||t=='SUBMIT')){n=o.value;x"
+"=3}else if(o.src&&t=='IMAGE')n=o.src;if(n){o.s_oid=s.fl(n,100);o.s_"
+"oidt=x}}return o.s_oid};s.rqf=function(t,un){var s=this,e=t.indexOf"
+"('='),u=e>=0?','+t.substring(0,e)+',':'';return u&&u.indexOf(','+un"
+"+',')>=0?s.epa(t.substring(e+1)):''};s.rq=function(un){var s=this,c"
+"=un.indexOf(','),v=s.c_r('s_sq'),q='';if(c<0)return s.pt(v,'&','rqf"
+"',un);return s.pt(un,',','rq',0)};s.sqp=function(t,a){var s=this,e="
+"t.indexOf('='),q=e<0?'':s.epa(t.substring(e+1));s.sqq[q]='';if(e>=0"
+")s.pt(t.substring(0,e),',','sqs',q);return 0};s.sqs=function(un,q){"
+"var s=this;s.squ[un]=q;return 0};s.sq=function(q){var s=this,k='s_s"
+"q',v=s.c_r(k),x,c=0;s.sqq=new Object;s.squ=new Object;s.sqq[q]='';s"
+".pt(v,'&','sqp',0);s.pt(s.un,',','sqs',q);v='';for(x in s.squ)s.sqq"
+"[s.squ[x]]+=(s.sqq[s.squ[x]]?',':'')+x;for(x in s.sqq)if(x&&s.sqq[x"
+"]&&(x==q||c<2)){v+=(v?'&':'')+s.sqq[x]+'='+s.ape(x);c++}return s.c_"
+"w(k,v,0)};s.wdl=new Function('e','var s=s_c_il['+s._in+'],r=true,b="
+"s.eh(s.wd,\"onload\"),i,o,oc;if(b)r=this[b](e);for(i=0;i<s.d.links."
+"length;i++){o=s.d.links[i];oc=o.onclick?\"\"+o.onclick:\"\";if((oc."
+"indexOf(\"s_gs(\")<0||oc.indexOf(\".s_oc(\")>=0)&&oc.indexOf(\".tl("
+"\")<0)s.eh(o,\"onclick\",0,s.lc);}return r');s.wds=function(){var s"
+"=this;if(s.apv>3&&(!s.isie||!s.ismac||s.apv>=5)){if(s.b&&s.b.attach"
+"Event)s.b.attachEvent('onclick',s.bc);else if(s.b&&s.b.addEventList"
+"ener)s.b.addEventListener('click',s.bc,false);else s.eh(s.wd,'onloa"
+"d',0,s.wdl)}};s.vs=function(x){var s=this,v=s.visitorSampling,g=s.v"
+"isitorSamplingGroup,k='s_vsn_'+s.un+(g?'_'+g:''),n=s.c_r(k),e=new D"
+"ate,y=e.getYear();e.setYear(y+10+(y<1900?1900:0));if(v){v*=100;if(!"
+"n){if(!s.c_w(k,x,e))return 0;n=x}if(n%10000>v)return 0}return 1};s."
+"dyasmf=function(t,m){if(t&&m&&m.indexOf(t)>=0)return 1;return 0};s."
+"dyasf=function(t,m){var s=this,i=t?t.indexOf('='):-1,n,x;if(i>=0&&m"
+"){var n=t.substring(0,i),x=t.substring(i+1);if(s.pt(x,',','dyasmf',"
+"m))return n}return 0};s.uns=function(){var s=this,x=s.dynamicAccoun"
+"tSelection,l=s.dynamicAccountList,m=s.dynamicAccountMatch,n,i;s.un."
+"toLowerCase();if(x&&l){if(!m)m=s.wd.location.host;if(!m.toLowerCase"
+")m=''+m;l=l.toLowerCase();m=m.toLowerCase();n=s.pt(l,';','dyasf',m)"
+";if(n)s.un=n}i=s.un.indexOf(',');s.fun=i<0?s.un:s.un.substring(0,i)"
+"};s.t=function(){var s=this,trk=1,tm=new Date,sed=Math&&Math.random"
+"?Math.floor(Math.random()*10000000000000):tm.getTime(),sess='s'+Mat"
+"h.floor(tm.getTime()/10800000)%10+sed,yr=tm.getYear(),vt=tm.getDate"
+"()+'/'+tm.getMonth()+'/'+(yr<1900?yr+1900:yr)+' '+tm.getHours()+':'"
+"+tm.getMinutes()+':'+tm.getSeconds()+' '+tm.getDay()+' '+tm.getTime"
+"zoneOffset(),tfs=s.gtfs(),ta='',q='',qs='';s.uns();if(!s.q){var tl="
+"tfs.location,x='',c='',v='',p='',bw='',bh='',j='1.0',k=s.c_w('s_cc'"
+",'true',0)?'Y':'N',hp='',ct='',pn=0,ps;if(s.apv>=4)x=screen.width+'"
+"x'+screen.height;if(s.isns||s.isopera){if(s.apv>=3){j='1.1';v=s.n.j"
+"avaEnabled()?'Y':'N';if(s.apv>=4){j='1.2';c=screen.pixelDepth;bw=s."
+"wd.innerWidth;bh=s.wd.innerHeight;if(s.apv>=4.06)j='1.3'}}s.pl=s.n."
+"plugins}else if(s.isie){if(s.apv>=4){v=s.n.javaEnabled()?'Y':'N';j="
+"'1.2';c=screen.colorDepth;if(s.apv>=5){bw=s.d.documentElement.offse"
+"tWidth;bh=s.d.documentElement.offsetHeight;j='1.3';if(!s.ismac&&s.b"
+"){s.b.addBehavior('#default#homePage');hp=s.b.isHomePage(tl)?\"Y\":"
+"\"N\";s.b.addBehavior('#default#clientCaps');ct=s.b.connectionType}"
+"}}else r=''}if(s.pl)while(pn<s.pl.length&&pn<30){ps=s.fl(s.pl[pn].n"
+"ame,100)+';';if(p.indexOf(ps)<0)p+=ps;pn++}s.q=(x?'&s='+s.ape(x):''"
+")+(c?'&c='+s.ape(c):'')+(j?'&j='+j:'')+(v?'&v='+v:'')+(k?'&k='+k:''"
+")+(bw?'&bw='+bw:'')+(bh?'&bh='+bh:'')+(ct?'&ct='+s.ape(ct):'')+(hp?"
+"'&hp='+hp:'')+(p?'&p='+s.ape(p):'')}if(s.usePlugins)s.doPlugins(s);"
+"var l=s.wd.location,r=tfs.document.referrer;if(!s.pageURL)s.pageURL"
+"=s.fl(l?l:'',255);if(!s.referrer)s.referrer=s.fl(r?r:'',255);if(s.l"
+"nk||s.eo){var o=s.eo?s.eo:s.lnk;if(!o)return '';var p=s.gv('pageNam"
+"e'),w=1,t=s.ot(o),n=s.oid(o),x=o.s_oidt,h,l,i,oc;if(s.eo&&o==s.eo){"
+"while(o&&!n&&t!='BODY'){o=o.parentElement?o.parentElement:o.parentN"
+"ode;if(!o)return '';t=s.ot(o);n=s.oid(o);x=o.s_oidt}oc=o.onclick?''"
+"+o.onclick:'';if((oc.indexOf(\"s_gs(\")>=0&&oc.indexOf(\".s_oc(\")<"
+"0)||oc.indexOf(\".tl(\")>=0)return ''}ta=o.target;h=o.href?o.href:'"
+"';i=h.indexOf('?');h=s.linkLeaveQueryString||i<0?h:h.substring(0,i)"
+";l=s.linkName?s.linkName:s.ln(h);t=s.linkType?s.linkType.toLowerCas"
+"e():s.lt(h);if(t&&(h||l))q+='&pe=lnk_'+(t=='d'||t=='e'?s.ape(t):'o'"
+")+(h?'&pev1='+s.ape(h):'')+(l?'&pev2='+s.ape(l):'');else trk=0;if(s"
+".trackInlineStats){if(!p){p=s.gv('pageURL');w=0}t=s.ot(o);i=o.sourc"
+"eIndex;if(s.gg('objectID')){n=s.gg('objectID');x=1;i=1}if(p&&n&&t)q"
+"s='&pid='+s.ape(s.fl(p,255))+(w?'&pidt='+w:'')+'&oid='+s.ape(s.fl(n"
+",100))+(x?'&oidt='+x:'')+'&ot='+s.ape(t)+(i?'&oi='+i:'')}}if(!trk&&"
+"!qs)return '';var code='';if(trk&&s.vs(sed))code=s.mr(sess,(vt?'&t="
+"'+s.ape(vt):'')+s.hav()+q+(qs?qs:s.rq(s.un)),ta);s.sq(trk?'':qs);s."
+"lnk=s.eo=s.linkName=s.linkType=s.wd.s_objectID='';return code};s.tl"
+"=function(o,t,n){var s=this;s.lnk=s.co(o);s.linkType=t;s.linkName=n"
+";s.t()};s.ssl=(s.wd.location.protocol.toLowerCase().indexOf('https'"
+")>=0);s.d=document;s.b=s.d.body;s.n=navigator;s.u=s.n.userAgent;s.n"
+"s6=s.u.indexOf('Netscape6/');var apn=s.n.appName,v=s.n.appVersion,i"
+"e=v.indexOf('MSIE '),o=s.u.indexOf('Opera '),i;if(v.indexOf('Opera'"
+")>=0||o>0)apn='Opera';s.isie=(apn=='Microsoft Internet Explorer');s"
+".isns=(apn=='Netscape');s.isopera=(apn=='Opera');s.ismac=(s.u.index"
+"Of('Mac')>=0);if(o>0)s.apv=parseFloat(s.u.substring(o+6));else if(i"
+"e>0){s.apv=parseInt(i=v.substring(ie+5));if(s.apv>3)s.apv=parseFloa"
+"t(i)}else if(s.ns6>0)s.apv=parseFloat(s.u.substring(s.ns6+10));else"
+" s.apv=parseFloat(v);s.em=0;if(String.fromCharCode){i=escape(String"
+".fromCharCode(256)).toUpperCase();s.em=(i=='%C4%80'?2:(i=='%U0100'?"
+"1:0))}s.un=un;s.uns();s.vl_l='vmk,charSet,visitorNamespace,cookieDo"
+"mainPeriods,cookieLifetime,pageName,pageURL,referrer,currencyCode,p"
+"urchaseID';s.vl_t=s.vl_l+',variableProvider,channel,server,pageType"
+",campaign,state,zip,events,products,linkName,linkType';for(var n=1;"
+"n<51;n++)s.vl_t+=',prop'+n+',eVar'+n+',hier'+n;s.vl_g=s.vl_t+',trac"
+"kDownloadLinks,trackExternalLinks,trackInlineStats,linkLeaveQuerySt"
+"ring,linkDownloadFileTypes,linkExternalFilters,linkInternalFilters,"
+"linkNames';if(pg)s.gl(s.vl_g);s.ss=ss;if(!ss){s.wds();s.ca()}}",
l=window.s_c_il,n=navigator,u=n.userAgent,v=n.appVersion,e=v.indexOf(
'MSIE '),m=u.indexOf('Netscape6/'),a,i,s;if(l)for(i=0;i<l.length;i++){
s=l[i];s.uns();if(s.un==un)return s;else if(s.pt(s.un,',','isf',un)){
s=s.co(s);s.un=un;s.uns();return s}}if(e>0){a=parseInt(i=v.substring(e
+5));if(a>3)a=parseFloat(i)}else if(m>0)a=parseFloat(u.substring(m+10)
);else a=parseFloat(v);if(a>=5&&v.indexOf('Opera')<0&&u.indexOf(
'Opera')<0){eval(c);return new s_c(un,pg,ss)}else s=s_c2f(c);return s(
un,pg,ss)}

/*  logAnalytics
 *  (c) 2006 Kristin Cobeaga <kcobeaga@personalshopper.com>
 *  (c) 2007 Justin Alderson <jalderson@personalshopper.com>
 *
 *  logAnalytics provides the interface to write traffic and event data
 *  to Omniture's SiteCatalyst system for analytics reporting and analysis.
 *
/*--------------------------------------------------------------------------*/

/* moved to personalshopper/src/avenueme/taglib/headerIncludes.java
*/
var testWithAlerts = false;
var MAXPRODUCTSTRINGSIZE = 1500;
var off = false;    // flag to easily turn off omniture recording if necessary

/**************************************************
** CART EVENTS
***************************************************/
function LogCartEvent(pCartEvent,pEventName,pMerchantType) {
    if (off) return;
    
    if (pCartEvent.length == 0)
        return;

    if (isLoggedIn){
        s.prop1="Registered";
        s.eVar7=buyNowInfo.userid;
    }
    else{
        s.prop1="Unregistered";
        s.eVar11=buyNowInfo.visitorid;
    }

    if (pMerchantType.length > 0) {
        if (pMerchantType == "DM") {
            s.eVar21="DIRECT";
        }
        if (pMerchantType == "IM") {
            s.eVar21="OFFLINE";
        }
    }
    else {
        s.eVar21="";
    }

    s.prop2=s.getNewRepeat();
    s.eVar1=s.prop1;
    s.eVar2=s.prop2;

    s.events=pCartEvent;  //"event34"

    s.linkTrackVars="prop1,prop2,eVar1,eVar2,eVar7,eVar21,events"
    s.linkTrackEvents=pCartEvent;  	//"event34"

    var lReturn = s.tl(true, "o", pEventName)
    var alertName = "SiteCatalyst.LogCartEvent: \n" + pEventName

    if (testWithAlerts) alert(alertName)

    //Reset all variables to blank
    ResetAllVars()
    return true ;
}

function LogCartOpen(pTransactionID, pMerchantType) {
    if (off) return;
    //scOpenCart(pTransactionID) {

    if (isLoggedIn){
        s.prop1="Registered";
        s.eVar7=buyNowInfo.userid;
    }
    else{
        s.prop1="Unregistered";
        s.eVar11=buyNowInfo.visitorid;
    }
    if (pMerchantType.length > 0) {
        if (pMerchantType == "DM") {
            s.eVar21="DIRECT";
        }
        if (pMerchantType == "IM") {
            s.eVar21="OFFLINE";
        }
    }
    else {
        s.eVar21="";
    }
    s.prop2=s.getNewRepeat();
    s.eVar1=s.prop1;
    s.eVar2=s.prop2;

    s.events="scOpen"
    //s.transactionID = pTransactionID;

    s.linkTrackVars="prop1,prop2,eVar1,eVar2,eVar7,eVar11,eVar21,events"
    s.linkTrackEvents=s.events;

    var lReturn = s.tl(true, "o", "Open cart")
    //var lReturn = s.t()
    var alertName = "SiteCatalyst.LogCartOpen: \n" + pTransactionID

    if (testWithAlerts) {
        alert(alertName);
    }

    //Reset all variables to blank
    ResetAllVars()
    return true ;
}

function scView() {
    if (off) return;
    //scOpenCart(pTransactionID) {

    if (isLoggedIn) {
        s.prop1="Registered";
        s.eVar7=buyNowInfo.userid;
    }
    else {
        s.prop1="Unregistered";
        s.eVar11=buyNowInfo.visitorid;
    }
 
    s.prop2=s.getNewRepeat();
    s.eVar1=s.prop1;
    s.eVar2=s.prop2;

    s.events="scView";

    s.linkTrackVars="prop1,prop2,eVar1,eVar2,eVar7,eVar11,events";
    s.linkTrackEvents=s.events;

    var lReturn = s.tl(true, "o", "scView")
    //var lReturn = s.t()
    var alertName = "SiteCatalyst.scView";

    if (testWithAlerts) {
        alert(alertName);
    }

    //Reset all variables to blank
    ResetAllVars()
    return true ;
}


function scCheckout(pTransactionID, pProducts) {
    if (off) return;

    if (isLoggedIn){
        s.prop1="Registered";
        s.eVar7=buyNowInfo.userid;
    }
    else{
        s.prop1="Unregistered";
        s.eVar11=buyNowInfo.visitorid;
    }
    s.prop2=s.getNewRepeat();
    s.eVar1=s.prop1;
    s.eVar2=s.prop2;
    s.events="scCheckout"
    s.eVar22 = pTransactionID;
    s.products = pProducts
    //s.transactionID = pTransactionID;

    s.linkTrackVars="prop1,prop2,eVar1,eVar2,eVar7,eVar22,products,events"
    s.linkTrackEvents=s.events;

    var lReturn = s.tl(true, "o", "Checkout")
    //var lReturn = s.t()
    var alertName = "SiteCatalyst.scCheckout: \n" + pProducts

    if (testWithAlerts) {
        alert(alertName);
    }

    //Reset all variables to blank
    ResetAllVars()
    return true ;
}

function cartPurchase(pTransactionID, pProducts) {
    if (off) return;

    if (pTransactionID.length == 0) {
        //return;
    }

    if (isLoggedIn){
        s.prop1="Registered";
        s.eVar7=buyNowInfo.userid;
    }
    else{
        s.prop1="Unregistered";
        s.eVar11=buyNowInfo.visitorid;
    }

    s.prop2=s.getNewRepeat();
    s.eVar1=s.prop1;
    s.eVar2=s.prop2;
    s.events="purchase"
    s.eVar22 = pTransactionID;
    s.products = pProducts
    s.purchaseID = pTransactionID;
    s.transactionID = pTransactionID;
    
    s.linkTrackVars="prop1,prop2,eVar1,eVar2,eVar7,eVar11,eVar22,products,purchase,transaction,events"
    s.linkTrackEvents=s.events;

    var lReturn = s.tl(true, "o", "Cart Purchase")
    var alertName = "SiteCatalyst.purchase: \nproducts: " + pProducts + "\nid : " + pTransactionID

    if (testWithAlerts) {
        alert(alertName);
    }

    //Reset all variables to blank
    ResetAllVars()
    return true ;
}


function scAdd(pID, pPrice, pQty, pMerchantType) {
    if (off) return;

	if (testWithAlerts) {
		alert("SiteCatalyst call: scAdd("+pID+", "+pPrice+", "+pQty+", "+pMerchantType+")");
	}
	if (isLoggedIn){
		s.prop1="Registered";
		s.eVar7=buyNowInfo.userid;
	}
	else{
		s.prop1="Unregistered";
		s.eVar11=buyNowInfo.visitorid;
	}
	
	if (pMerchantType.length > 0) {
		if (pMerchantType == "DM") {
			s.eVar21="DIRECT";
			s.events="scAdd,event35";
		}
		if (pMerchantType == "IM") {
			s.eVar21="OFFLINE";
			s.events="scAdd,event34";
		}
	} 
	else {
		s.eVar21="";	
		s.events="scAdd";
	}

	s.prop2=s.getNewRepeat();
	s.eVar1=s.prop1;
	s.eVar2=s.prop2;
	
	s.products+=";" + pID + ";" + pQty + ";" + pQty*pPrice;
	
	//s.products="Category;ProductName;Qty;total_price [,Category2;ProductName2;Qty;total_price]"
	//s.state="XX"
	//s.zip="00000"
	//s.purchaseID=""
	//s.events="purchase"
	
	s.linkTrackVars="prop1,prop2,eVar1,eVar2,eVar7,eVar11,eVar21,events,products"
	s.linkTrackEvents=s.events;

    var lReturn = s.t()
    	
	if (testWithAlerts) {
		alert("SiteCatalyst.scAdd.products: "+s.products+"\nevents: "+s.events+"\nlinkTrackVars: "+s.linkTrackVars);
	}
	
	//Reset all variables to blank
	ResetAllVars()
    return true ;
}

function scRemove(pID, pPrice, pQty, pMerchantType) {
    if (off) return;

	if (isLoggedIn){
		s.prop1="Registered";
		s.eVar7=buyNowInfo.userid;
	}
	else{
		s.prop1="Unregistered";
		s.eVar11=buyNowInfo.visitorid;
	}
	
	if (pMerchantType.length > 0) {
		if (pMerchantType == "DM") {
			s.eVar21="DIRECT";
			s.events="scRemove,event37";
		}
		if (pMerchantType == "IM") {
			s.eVar21="OFFLINE";
			s.events="scRemove,event36";
		}
	} 
	else {
		pMerchantType = "";
		s.eVar21="";	
		s.events="scRemove";
	}

	s.prop2=s.getNewRepeat();
	s.eVar1=s.prop1;
	s.eVar2=s.prop2;
	
	s.products+=";" + pID + ";" + pQty + ";" + pQty*pPrice;
	
	//s.products="Category;ProductName;Qty;total_price [,Category2;ProductName2;Qty;total_price]"
	//s.state="XX"
	//s.zip="00000"
	//s.purchaseID=""
	//s.events="purchase"
 	
	s.linkTrackVars="prop1,prop2,eVar1,eVar2,eVar7,eVar11,eVar21,products,events"
	s.linkTrackEvents=s.events;

    var lReturn = s.t()
    	
	if (testWithAlerts) {
		alert("SiteCatalyst.scRemove.products: "+s.products+"\nevents: "+s.events+"\nlinkTrackVars: "+s.linkTrackVars);
	}
	
	//Reset all variables to blank
	ResetAllVars()
    return true ;
}




/** PAGE VIEWS **/
function LogPageView(pPageName, pChannel) {
    if (off) return;

	var sPageName = pPageName.replace(/'/g,'');
	var sChannel = pChannel.replace(/'/g,'');
    s.pageName=sPageName;
    s.channel=sChannel;

    if (isLoggedIn){
        s.prop1="Registered"
        s.eVar7=buyNowInfo.userid
    }
    else{
        s.prop1="Unregistered"
        s.eVar11=buyNowInfo.visitorid
    }
    s.prop2=s.getNewRepeat()
    s.eVar1=s.prop1
    s.eVar2=s.prop2
    s.eVar3=sPageName

    var lReturn = s.t()

    if (testWithAlerts) {
        alert("SiteCatalyst.LogPageView:\n" + sPageName)
    }
    //Reset all variables to blank
    ResetAllVars()
    return true ;
}

function LogStaticPageView(pPageName, pChannel) {
    if (off) return;

    s.pageName=pPageName
    s.channel=pChannel

    s.prop1="Unregistered"
    s.prop2=s.getNewRepeat()
    s.eVar1=s.prop1
    s.eVar2=s.prop2
    s.eVar3=pPageName

    var lReturn = s.t()

    if (testWithAlerts) {
        alert("SiteCatalyst.LogStaticPageView: \n" + pPageName)
    }
    //Reset all variables to blank
    ResetAllVars()
    return true ;
}

function LogErrorPageView(pPageName, pChannel) {
    if (off) return;

    s.pageName=pPageName
    s.channel=pChannel
    if (isLoggedIn){
        s.prop1="Registered"
        s.eVar7=buyNowInfo.userid}
    else{
        s.prop1="Unregistered"
        s.eVar11=buyNowInfo.visitorid}
    s.pageType="errorPage"
    s.prop2=s.getNewRepeat()
    s.eVar1=s.prop1
    s.eVar2=s.prop2
    s.eVar3=pPageName

    var lReturn = s.t()

    if (testWithAlerts) alert("SiteCatalyst.LogErrorPageView: \n" + pPageName)

    //Reset all variables to blank
    ResetAllVars()
    return true ;
}
/**************************************************
** GENERAL SITE EVENTS
***************************************************/
function LogSiteEvent(pEvent,pEventName) {
    if (off) return;

    if (pEvent.length == 0)
        return;

    if (pEventName.length == 0)
        pEventName = '';

    if (isLoggedIn){
        s.prop1="Registered";
        s.eVar7=buyNowInfo.userid;
    }
    else{
        s.prop1="Unregistered";
        s.eVar11=buyNowInfo.visitorid;
    }
    s.prop2=s.getNewRepeat();
    s.eVar1=s.prop1;
    s.eVar2=s.prop2;

    s.events=pEvent;  //"event34"

    s.linkTrackVars="prop1,prop2,eVar1,eVar2,eVar7,events";
    s.linkTrackEvents=pEvent;  	//"event34"

    var lReturn = s.tl(true, "o", pEventName)
    var alertName = "SiteCatalyst.LogCartEvent: \n" + pEventName

    if (testWithAlerts)
        alert(alertName);

    //Reset all variables to blank
    ResetAllVars();
    return true ;
}
/**************************************************
** COMMUNITY EVENTS
***************************************************/

/*
	Save a collection 			=	LogCommunityEvent("event18","SaveCollection");
	Purchase a Collection 		=	LogCommunityEvent("event19","PurchaseCollection");
	Confirm Purchase Collection	=	LogCommunityEvent("event20","ConfirmPurchaseCollection");
	Delete a Collection			=	LogCommunityEvent("event22","DeleteCollection");
	CancelDeleteCollection		=	LogCommunityEvent("event23","CancelDeleteCollection");
	Share By Email				=	LogCommunityEvent("event24","ShareByEmail");
	Preview Email				=	LogCommunityEvent("event25","PreviewEmail");
	Generate Embed Code			=	LogCommunityEvent("event26","GenerateEmbedCode");
	Preview Widget				=	LogCommunityEvent("event31","PreviewWidget");
	Grab the Url			    =	LogCommunityEvent("event32","Grab the Url");
	Remove item from collection	=	LogCommunityEvent("event33","RemoveItem");
	URL Preview					=	LogCommunityEvent("event40","URLPreview");
	Save a collection 				=	LogCommunityEvent("event18","SaveCollection");
	Purchase a Collection 			=	LogCommunityEvent("event19","PurchaseCollection");
	Confirm Purchase Collection		=	LogCommunityEvent("event20","ConfirmPurchaseCollection");
	Delete a Collection				=	LogCommunityEvent("event22","DeleteCollection");
	CancelDeleteCollection			=	LogCommunityEvent("event23","CancelDeleteCollection");
	Share By Email					=	LogCommunityEvent("event24","ShareByEmail");
	Preview Email					=	LogCommunityEvent("event25","PreviewEmail");
	Generate Embed Code				=	LogCommunityEvent("event26","GenerateEmbedCode");
	Preview Widget					=	LogCommunityEvent("event31","PreviewWidget");
	Grab the Url     				=	LogCommunityEvent("event32","GrabTheUrl");
	Remove item from collection		=	LogCommunityEvent("event33","RemoveItem");
	URL Preview						=	LogCommunityEvent("event40","URLPreview");
*/
	
function LogCommunityEvent(pEvent,pEventName) {
    if (off) return;

    if (pEvent.length == 0)
        return;

    if (pEventName.length == 0)
        pEventName = '';

    if (isLoggedIn){
        s.prop1="Registered";
        s.eVar7=buyNowInfo.userid;
    }
    else{
        s.prop1="Unregistered";
        s.eVar11=buyNowInfo.visitorid;
    }
    s.prop2=s.getNewRepeat();
    s.eVar1=s.prop1;
    s.eVar2=s.prop2;

    s.events=pEvent;  //"event34"

    s.linkTrackVars="prop1,prop2,eVar1,eVar2,eVar7,events";
    s.linkTrackEvents=pEvent;  	//"event34"

    var lReturn = s.tl(true, "o", pEventName)
    var alertName = "SiteCatalyst.LogComunityEvent: \n" + pEventName

    if (testWithAlerts)
        alert(alertName);

    //Reset all variables to blank
    ResetAllVars();
    return true ;
}
/**************************************************
** PAGE EVENTS
***************************************************/
function LogUpdateMyProfile() {
    if (off) return;
//event7
    if (isLoggedIn){
        s.prop1="Registered"
        s.eVar7=buyNowInfo.userid}
    else{
        s.prop1="Unregistered"
        s.eVar11=buyNowInfo.visitorid}
    s.prop2=s.getNewRepeat()
    s.eVar1=s.prop1
    s.eVar2=s.prop2

    s.events="event7"

    s.linkTrackVars="prop1,prop2,eVar1,eVar2,eVar7,eVar11,events"
    s.linkTrackEvents="event7"

    var lReturn = s.tl(true, "o", "Update My Profile")

    if (testWithAlerts) alert("SiteCatalyst.LogUpdateMyProfile")

    //Reset all variables to blank
    ResetAllVars()
    return true ;
}

function LogDeleteMyProfile() {
    if (off) return;
//event8
    if (isLoggedIn){
        s.prop1="Registered"
        s.eVar7=buyNowInfo.userid}
    else{
        s.prop1="Unregistered"
        s.eVar11=buyNowInfo.visitorid}
    s.prop2=s.getNewRepeat()
    s.eVar1=s.prop1
    s.eVar2=s.prop2

    s.events="event8"

    s.linkTrackVars="prop1,prop2,eVar1,eVar2,eVar7,eVar11,events"
    s.linkTrackEvents="event8"

    var lReturn = s.tl(true, "o", "Delete from My Profile")

    if (testWithAlerts) alert("SiteCatalyst.LogDeleteMyProfile")

    //Reset all variables to blank
    ResetAllVars()
    return true ;
}

function LogAddRecipientProfile() {
    if (off) return;
//event9,event10
    if (isLoggedIn){
        s.prop1="Registered"
        s.eVar7=buyNowInfo.userid}
    else{
        s.prop1="Unregistered"
        s.eVar11=buyNowInfo.visitorid}
    s.prop2=s.getNewRepeat()
    s.eVar1=s.prop1
    s.eVar2=s.prop2

    s.events="event9,event10"

    s.linkTrackVars="prop1,prop2,eVar1,eVar2,eVar7,eVar11,events"
    s.linkTrackEvents="event9,event10"

    var lReturn = s.tl(true, "o", "Add Recipient Profile")

    if (testWithAlerts) alert("SiteCatalyst.LogAddRecipient")

    //Reset all variables to blank
    ResetAllVars()
    return true ;
}

function LogSaveRecipientProfile() {
    if (off) return;
//event10
    if (isLoggedIn){
        s.prop1="Registered"
        s.eVar7=buyNowInfo.userid}
    else{
        s.prop1="Unregistered"
        s.eVar11=buyNowInfo.visitorid}
    s.prop2=s.getNewRepeat()
    s.eVar1=s.prop1
    s.eVar2=s.prop2

    s.events="event10"

    s.linkTrackVars="prop1,prop2,eVar1,eVar2,eVar7,eVar11,events"
    s.linkTrackEvents="event10"

    var lReturn = s.tl(true, "o", "Update Recipient Profile")

    if (testWithAlerts) alert("SiteCatalyst.LogSaveRecipientProfile")

    //Reset all variables to blank
    ResetAllVars()
    return true ;
}

function LogDeleteRecipientProfile() {
    if (off) return;
//event11
    if (isLoggedIn){
        s.prop1="Registered"
        s.eVar7=buyNowInfo.userid}
    else{
        s.prop1="Unregistered"
        s.eVar11=buyNowInfo.visitorid}
    s.prop2=s.getNewRepeat()
    s.eVar1=s.prop1
    s.eVar2=s.prop2

    s.events="event11"

    s.linkTrackVars="prop1,prop2,eVar1,eVar2,eVar7,eVar11,events"
    s.linkTrackEvents="event11"

    var lReturn = s.tl(true, "o", "Delete Recipient Profile")

    if (testWithAlerts) alert("SiteCatalyst.LogDeleteRecipient")

    //Reset all variables to blank
    ResetAllVars()
    return true ;
}

/**
 * This function tracks the registers/unregisters of the passed in
 *  newsletter (event28).
 *
 * TODO: OMNITURE does not currently have a eVar or prop
 *        value for the newsletterId. Once it does it should be added
 *        to the linkTrackVars
 * This is kind of a kludge right now, because they are being processed
 * When the user checks and unchecks the checkboxes and not when it is submitted
 * So it may inadvertently flag it as changed when they never submit. We should
 * add something that queues these up and then sends them on the submit.
 * Simply walking through the checkboxes on the page won't quite cut it since we
 * will not know chich ones changed at that point.
 */
function logProcessNewsletterRequest(checkbox, newsletterType) {
    if (off) return;
//event27/28
	var sEventName = "";
    if (isLoggedIn){
        s.prop1="Registered";
        s.eVar7=buyNowInfo.userid;
    } else {
        s.prop1="Unregistered";
        s.eVar11=buyNowInfo.visitorid;
    }
    s.prop2=s.getNewRepeat();
    s.eVar1=s.prop1;
    s.eVar2=s.prop2;

	if (newsletterType.length > 0) {
		s.eVar15=newsletterType;
	} else {
		s.eVar15="UNKNOWN";	
	}
    if(checkbox.checked){
        s.events="event27";
        s.linkTrackEvents="event27";
        sEventName="Newsletter Register";
    }else{
        s.events="event28";
        s.linkTrackEvents="event28";
        sEventName="Newsletter UnRegister";
    }

    //Add the emailType value to linTrackVars once it is a value in Omniture
    s.linkTrackVars="prop1,prop2,eVar1,eVar2,eVar7,eVar11,eVar15,events";

    var lReturn = s.tl(true, "o", sEventName);
    var alertName = "SiteCatalyst.logProcessNewsletterRequest: \n" + sEventName + ": " + newsletterType

    if (testWithAlerts) alert(alertName)

    //Reset all variables to blank
    ResetAllVars()
    return true ;
}

/**
 * This function records a subscription to an email type (event29).
 * TODO: OMNITURE does not currently have a eVar or prop
 *        value for the emailType.  Once it does it should be added
 *        to the linkTrackVars
 * This is kind of a kludge right now, because they are being processed
 * When the user checks and unchecks the checkboxes and not when it is submitted
 * So it may inadvertently flag it as changed when they never submit. We should
 * add something that queues these up and then sends them on the submit.
 * Simply walking through the checkboxes on the page won't quite cut it since we
 * will not know chich ones changed at that point.
 */
function logProcessSubscribeEmailRequest(checkbox, emailType) {
    if (off) return;
//event29/30
	var sEventName = "";
	if (isLoggedIn){
        s.prop1="Registered";
        s.eVar7=buyNowInfo.userid;
    } else {
        s.prop1="Unregistered";
        s.eVar11=buyNowInfo.visitorid;
    }
    s.prop2=s.getNewRepeat();
    s.eVar1=s.prop1;
    s.eVar2=s.prop2;

	if (emailType.length > 0) {
		s.eVar16=emailType;
	} else {
		s.eVar16="UNKNOWN";	
	}
    if(checkbox.checked) {
        s.events="event29";
        s.linkTrackEvents="event29";
        sEventName="Email Subscribe";
    } else {
        s.events="event30";
        s.linkTrackEvents="event30";
        sEventName="Email UnSubscribe";
    }

    //Add the emailType value to linTrackVars once it is a value in Omniture
    s.linkTrackVars="prop1,prop2,eVar1,eVar2,eVar7,eVar11,eVar16,events"

    var lReturn = s.tl(true, "o", sEventName)
    var alertName = "SiteCatalyst.logProcessSubscribeEmailRequest: \n" + sEventName + ": " + emailType

    if (testWithAlerts) alert(alertName)

    //Reset all variables to blank
    ResetAllVars()
    return true ;
}


function LogSearch(pSearchTerm) {
    if (off) return;
//eVar5
    if (pSearchTerm.trim().length == 0) return

    if (isLoggedIn){
        s.prop1="Registered"
        s.eVar7=buyNowInfo.userid}
    else{
        s.prop1="Unregistered"
        s.eVar11=buyNowInfo.visitorid}
    s.prop2=s.getNewRepeat()
    s.eVar1=s.prop1
    s.eVar2=s.prop2
    s.eVar5=pSearchTerm

    s.linkTrackVars="prop1,prop2,eVar1,eVar2,eVar5,eVar7,eVar11"

    var lReturn = s.tl(true, "o", "Search")

    if (testWithAlerts) alert("SiteCatalyst.LogSearch: " + pSearchTerm)

    //Reset all variables to blank
    ResetAllVars()
    return true ;
}

function LogJoin() {
    if (off) return;
//event5
    if (isLoggedIn){
        s.prop1="Registered";
        s.eVar7=buyNowInfo.userid;
    } else {
        s.prop1="Unregistered";
        s.eVar11=buyNowInfo.visitorid;
    }
    s.prop2=s.getNewRepeat();
    s.eVar1=s.prop1;
    s.eVar2=s.prop2;

    s.events="event5";

    s.linkTrackVars="prop1,prop2,eVar1,eVar2,eVar7,eVar11,events";
    s.linkTrackEvents="event5";


    var lReturn = s.tl(true, "o", "Joins/Create MyPB");

    if (testWithAlerts){
    	alert("SiteCatalyst.Join");
	}
	
    //Reset all variables to blank
    ResetAllVars();
    return true ;
}

function LogViewItem(pID) {
    if (off) return;
//event6
    //Simply return if there are no products returned
    if (pID.trim().length == 0 || pID.trim() == ";") return

    //Check to see if pID is too big; if it is, break it up into appropriately-sized chunks and send them
    //off individually. If not, send the whole thing as a single request to Omniture.
    var pIDArray = new Array()
    if (pID.length >= MAXPRODUCTSTRINGSIZE) {
        var pIDSplit = pID.split(',')
        var j = 0
        for (var k=0; j<pIDSplit.length-1; k++){
            pIDArray[k] = ''
            while (j<pIDSplit.length-1 && (pIDArray[k].length+pIDSplit[j].length+1)<MAXPRODUCTSTRINGSIZE) {
                pIDArray[k]=pIDArray[k]+pIDSplit[j]+','
                j++
            }
            pIDArray[k] = pIDArray[k]+';'
        }
    } else {
        pIDArray[0] = pID
    }

    for (var k = 0; k<pIDArray.length; k++) {
        pID = pIDArray[k]

        if (isLoggedIn){
            s.prop1="Registered"
            s.eVar7=buyNowInfo.userid}
        else{
            s.prop1="Unregistered"
            s.eVar11=buyNowInfo.visitorid}
        s.prop2=s.getNewRepeat()
        s.eVar1=s.prop1
        s.eVar2=s.prop2

        s.events="prodView,event6"
        s.products=pID

        s.linkTrackVars="prop1,prop2,eVar1,eVar2,eVar7,eVar10,eVar11,products,events"

        s.linkTrackEvents="prodView,event6"


        var lReturn = s.tl(true, "o", "View Item")

        if (testWithAlerts) alert("SiteCatalyst.LogViewItem: while " + k + "<" + pIDArray.length + "\nlength=" + pID.length + "\npID=" + pID + "\n")
    }
    //Reset all variables to blank
    ResetAllVars()
    return true ;
}

function LogSaveItem(pID, price) {
    if (off) return;
//event3,event4
//s.products=";product_id;;;event4=9.95"

    if (isLoggedIn){
        s.prop1="Registered"
        s.eVar7=buyNowInfo.userid}
    else{
        s.prop1="Unregistered"
        s.eVar11=buyNowInfo.visitorid}
    s.prop2=s.getNewRepeat()
    s.eVar1=s.prop1
    s.eVar2=s.prop2

    s.events="event3,event4"

    s.products=";" + pID + ";;;event4=" + price

    s.linkTrackVars="prop1,prop2,eVar1,eVar2,eVar7,eVar11,products,events"
    s.linkTrackEvents="prodView,event3,event4"

    var lReturn = s.tl(true, "o", "Save Item")

    if (testWithAlerts) alert("SiteCatalyst.LogSaveItem: ProductID=" + pID + "; Price=" + price)

    //Reset all variables to blank
    ResetAllVars()
}

function LogRemoveSaveItem(pID) {
    if (off) return;
//event14
    if (isLoggedIn){
        s.prop1="Registered"
        s.eVar7=buyNowInfo.userid}
    else{
        s.prop1="Unregistered"
        s.eVar11=buyNowInfo.visitorid}
    s.prop2=s.getNewRepeat()
    s.eVar1=s.prop1
    s.eVar2=s.prop2

    s.events="event14"
    s.products= ";" + pID

    s.linkTrackVars="prop1,prop2,eVar1,eVar2,eVar7,eVar11,products,events"
    s.linkTrackEvents="prodView,event14"

    var lReturn = s.tl(true, "o", "Remove Saved Item")

    if (testWithAlerts) alert("SiteCatalyst.LogRemoveSaveItem: " + pID)

    //Reset all variables to blank
    ResetAllVars()
}

function LogClickItem(pID) {
    if (off) return;
//event13
    if (isLoggedIn){
        s.prop1="Registered"
        s.eVar7=buyNowInfo.userid}
    else{
        s.prop1="Unregistered"
        s.eVar11=buyNowInfo.visitorid}
    s.prop2=s.getNewRepeat()
    s.eVar1=s.prop1
    s.eVar2=s.prop2

    s.events="prodView,event13"
    s.products= ";" + pID

    s.linkTrackVars="prop1,prop2,eVar1,eVar2,eVar7,eVar11,products,events"
    s.linkTrackEvents="prodView,event13"

    var lReturn = s.tl(true, "o", "Click Item")

    if (testWithAlerts) alert("SiteCatalyst.LogClickItem: " + pID)

    //Reset all variables to blank
    ResetAllVars()
}

function LogClickBuyNow(pProductId, pPrice, pProductCategory, pUserID, pVisitorID, pAdCode, pTimeStamp, pClickType) {
    if (off) return;
//event2, event1
    var lVarString = ""

    if (isLoggedIn){
        s.prop1="Registered"
    }else{
        s.prop1="Unregistered"
    }

    s.prop2=s.getNewRepeat()
    s.eVar1=s.prop1
    s.eVar2=s.prop2

    lVarString = "prop1,prop2,eVar1,eVar2"

    if (pUserID != -1){
        s.eVar7=pUserID
        lVarString += ",eVar7"}
    if (pProductCategory > ""){
        s.eVar10=pProductCategory
        lVarString += ",eVar10"}
    if (pVisitorID > ""){
        s.eVar11=pVisitorID
        lVarString += ",eVar11"}
    if (pAdCode > ""){
        s.eVar12=pAdCode
        lVarString += ",eVar12"}
    s.eVar13=pTimeStamp
    lVarString += ",eVar13"

    s.products= ";" + pProductId + ";;;event1=" + pPrice

    if (pClickType==9) {
    //A '9' represents a click on 'View More Details from Merchant Site'
        s.events="event1,event12"
        s.linkTrackEvents="prodView,event1,event12"
    }else{
    //A '10' represents a click on 'Buy Now'
        s.events="event1,event2"
        s.linkTrackEvents="prodView,event1,event2"
    }

    s.linkTrackVars = lVarString + ",products,events"

    var lReturn = s.tl(true, "o", "Click Buy Now")

    if (testWithAlerts) alert("SiteCatalyst.LogClickBuyNow: s.events=" + s.events + ";s.linkTrackVars=" + s.linkTrackVars + "; Productid=" + pProductId + "; Price=" + pPrice + "; ProductCategory="  + pProductCategory + "; UserID=" + pUserID + "; VisitorID=" + pVisitorID + "; AdCode=" + pAdCode + "; TimeStamp=" + pTimeStamp)

    //Reset all variables to blank
    ResetAllVars()
}

function LogMerchantSpecials(pProductId, pPrice, pUserID, pVisitorID, pAdCode, pTimeStamp) {
    if (off) return;
//event17
    var lVarString = ""

    if (isLoggedIn){
        s.prop1="Registered"
    }else{
        s.prop1="Unregistered"
    }

    s.prop2=s.getNewRepeat()
    s.eVar1=s.prop1
    s.eVar2=s.prop2

    lVarString = "prop1,prop2,eVar1,eVar2"

    if (pUserID != -1){
        s.eVar7=pUserID
        lVarString += ",eVar7"}
    if (pVisitorID > ""){
        s.eVar11=pVisitorID
        lVarString += ",eVar11"}
    if (pAdCode > ""){
        s.eVar12=pAdCode
        lVarString += ",eVar12"}
    s.eVar13=pTimeStamp
    lVarString += ",eVar13"

    s.products= ";" + pProductId + ";;;event1=" + pPrice

    s.events="event17"
    s.linkTrackEvents="prodView,event17"

    s.linkTrackVars = lVarString + ",products,events"

    var lReturn = s.tl(true, "o", "Merchant Specials")

    if (testWithAlerts) alert("LogMerchantSpecials: s.events=" + s.events + ";s.linkTrackVars=" + s.linkTrackVars + "; Productid=" + pProductId + "; Price=" + pPrice + "; ProductCategory="  + pProductCategory + "; UserID=" + pUserID + "; VisitorID=" + pVisitorID + "; AdCode=" + pAdCode + "; TimeStamp=" + pTimeStamp)

    //Reset all variables to blank
    ResetAllVars()
}

function LogDownloadDPS() {
    if (off) return;
    if (isLoggedIn){
        s.prop1="Registered"
        s.eVar7=buyNowInfo.userid}
    else{
        s.prop1="Unregistered"
        s.eVar11=buyNowInfo.visitorid}
    s.prop2=s.getNewRepeat()
    s.eVar1=s.prop1
    s.eVar2=s.prop2

    var lReturn = s.tl(true, "d", "Download DPS")

    if (testWithAlerts) alert("SiteCatalyst.LogDownloadDPS")

    //Reset all variables to blank
    ResetAllVars()
}

function ResetAllVars(){
    if (off) return;
    s.pageName=""
    s.channel=""
    s.pageType=""
    s.state=""      //Billing (user) state
    s.zip=""        //Billing (user) zip
    s.prop1="" 		//Visitor Type Registered/Unregistered
    s.prop2="" 		//New/Repeat Visitor
    //s.prop3="Custom Insight 3"
    //s.prop4="Custom Insight 4"
    //s.prop5="Custom Insight 5"
    s.prop6=""		//Shipping State
    s.prop7=""		//Shipping Zip
    s.campaign=""
    s.products=""
    s.transactionID=""
    s.purchaseID=""
    s.eVar1=""		//Visitor Type Registered/Unregistered
    s.eVar2=""		//New/Repeat Visitor
    s.eVar3=""		//Page name
    s.eVar4=""		//Merchant - Data Import only
    s.eVar5=""		//Internal Search Terms
    s.eVar6=""		//Internal Campaigns
    s.eVar7=""		//User ID
    s.eVar8=""		//Personas
    s.eVar9=""		//Recipient Personas
    s.eVar10=""     //Product Category
    s.eVar11=""     //Buy Now VisitorID
    s.eVar12=""     //Buy Now Ad Code
    s.eVar13=""     //Buy Now Timestamp
    s.eVar14=""     //Commissions - Data Import only
	s.eVar15=""		//Newsletter Subscription Type
	s.eVar16=""		//Email Subscription Type
	s.eVar17=""		//UNUSED - Custom eVar17
	s.eVar18=""		//UNUSED - Custom eVar18
	s.eVar19=""		//UNUSED - Custom eVar19
	s.eVar20=""		//UNUSED - Custom eVar20
	s.eVar21=""		//Online/Offline Order
	s.eVar22=""		//Transaction ID (for DM)
	s.eVar23=""		//Shipping State
	s.eVar24=""		//Shipping Zip
	
	
    s.events=""		//event1: Buy Now Dollars
                    //event2: Buy Now Clicks
                    //event3: Saved Items
                    //event4: Value of Saved Items
                    //event5: Joins/Create MyPB
                    //event6: Product Impressions
                    //event7: Profile Updated
                    //event8: Profile Deleted
                    //event9: Recipients
                    //event10: Recipient Profile Added
                    //event11: Recipient Profile Modified (Deleted?)
                    //event12: Merchant Details Viewed
                    //event13: Clicked Items
                    //event14: Saved Items Removed
                    //event15: SilverPop - Number of Messages Sent
                    //event16: SilverPop - Number of Messages Opened
                    //event17: Merchant Specials
                    //**** ACCOUNT EVENTS ****//
                    //event18: Save Collection [was Billing Address Added]
                    //event19: Purchase Collection [was Billing Address Updated]
                    //event20: Confirm Purchase Collection [was Billing Address Deleted]
                    //event21: Cancel Purchase Collection [was Shipping Address Added]
                    //event22: Delete Collection [was Shipping Address Updated]
                    //event23: Cancel Delete Collection [was Shipping Address Deleted]
                    //event24: Share By Email [was Credit Card Added]
                    //event25: Preview Email [was Credit Card Updated]
                    //event26: Generate Embed Code [was Credit Card Deleted]
                    //event27: Newsletter Register
                    //event28: Newsletter UnRegister
                    //event29: Email Subscribe
                    //event30: Email Unsubscribe
                    //event31: Preview Widget [was Login Updated]
                    //event32: Grab the Url [was Password Updated]
                    //event33: Remove Item [was Security Question updated]
                    //**** CART EVENTS ****//
                    //event34: Add IM Product to Cart
                    //event35: Add DM Product to Cart
                    //event36: Remove IM Product from Cart
                    //event37: Remove DM Product from Cart
                    //event38: Save IM Product for Later
                    //event39: Save DM Product for Later
                    //event40: URL Preview [was Checkout Cart]
                    //event41: Complete Order
                    //event42: Returned Revenue
                    //event43: Returned Orders

}
//Author:  Phil Armstrong
//This file is used to create positionable, customizable div's



var posBoxNum=0
function posDiv()
{
	this.val = "Empty";
	this.align="right";
	this.id=posBoxNum;
	this.backgroundcolor= "white";
	this.bordercolor="white";
	this.borderthick="0px";
	this.width="100px";
	this.inneralign="left";
	this.time;
	this.obj;
	this.div=document.createElement('div');
	this.hostRObgC="";
	this.hostROfgC="";
	this.hostMObgC="";
	this.hostMOfgC="";
	this.host=null;
	
	
	this.writePosBox=function(ob,idname)
	{		
		this.obj=ob
		var out = this.div;
		out.id = 'posBox' + posBoxNum;
//		out.style.padding = '5px 12px 5px 12px';
		out.style.visibility = 'hidden';
		out.style.textAlign = this.inneralign;
		out.style.zIndex = '20'
		out.style.position = 'absolute';
		out.style.width = this.width; 
		out.style.backgroundColor = this.backgroundcolor;
		out.style.border = this.borderthick + ' solid ' + this.bordercolor;
		out.onmouseover = this.obj.Active.bind(this.obj);
		out.onmouseout = this.obj.hidePosBox.bind(this.obj);
		posBoxNum++;
		document.body.appendChild(out);	
			
	}
	this.Active=function()
	{
		window.clearTimeout(this.time);
	}
	
	
	this.displayPosBox=function(idname,curstring,object)
	{	
		if(this.host!=null && this.host!=idname)
			this.hidePosBoxHelper();
		
		window.clearTimeout(this.time)	
		this.val=curstring
		var element=$("posBox"+this.id);
		if (!element)
			return
		if(curstring!=null)
		    element.innerHTML=curstring;
		if(idname!=null)
			var guide=$(idname);
		else
			var guide=object
		this.host=guide;
		this.host.style.backgroundColor=this.hostRObgC;
		this.host.style.color=this.hostROfgC;
		var position = getTopLeft(guide);
		if(this.align=="right")
			position['x']=position['x']+guide.offsetWidth
		if(this.align=="left")
			position['x']=position['x']-element.offsetWidth
		if(this.align=="bottom")
			position['y']=position['y']+guide.offsetHeight
		if(this.align=="top")
			position['y']=position['y']-element.offsetHeight
		
		element.style.left=position['x']+'px';
		element.style.top=position['y']+'px';	
		element.style.visibility='visible'
	
	}
	this.hidePosBox=function()
	{	
		if(!this.obj)return;	
		this.time=setTimeout(this.obj.hidePosBoxHelper.bind(this.obj),1);		
	}
	this.hidePosBoxHelper = function()
	{
		
		var element=$("posBox"+this.id);
		this.host.style.backgroundColor=this.hostMObgC;
		this.host.style.color=this.hostMOfgC;
		element.style.visibility='hidden'
	}
		
	this.setBorderWidth=function(w)
	{
		this.borderthick=w;
	}
	this.setBorderColor=function(col)
	{

		this.div.style.border = this.borderthick + ' solid ' + col;
	}
	this.setWidth=function(w)
	{
		this.div.style.width=w;	
	}	
	this.setBgColor=function(col)
	{
		this.div.style.backgroundColor=col;
	}
	this.setElementAlign=function(a)
	{
		this.align=a;
	}
	this.setInnerAlign=function(a)
	{
		this.div.style.textAlign=a;
	}
	this.setHostMouseOverColors=function(b,f)
	{
		this.hostRObgC=b;
		this.hostROfgC=f;
	}	
	this.setHostMouseOutColors=function(b,f)
	{
		this.hostMObgC=b;
		this.hostMOfgC=f;
	}
	this.setStyle=function(style)
	{
		this.div.style=style;
	}
	this.resetStyle=function()
	{
		//this.div.style="";
	}
}

//instantiate one instance of the div for general purpose used in formatters and such.
var globalPositionableDiv=new posDiv();
//globalPositionableDiv.writePosBox(globalPositionableDiv);
window.onload=new Function("globalPositionableDiv.writePosBox(globalPositionableDiv)");
var ListUtil = new Object();

ListUtil.getSelectedIndexes = function (oListbox) {
    var arrIndexes = new Array;

    for (var i=0; i < oListbox.options.length; i++) {
        if (oListbox.options[i].selected) {
            arrIndexes.push(i);
        }
    }

    return arrIndexes;
};

ListUtil.add = function (oListbox, sName, sValue) {

    var oOption = document.createElement("option");
    oOption.appendChild(document.createTextNode(sName));

    if (arguments.length == 3) {
        oOption.setAttribute("value", sValue);
    }

    oListbox.appendChild(oOption);

}

ListUtil.remove = function (oListbox, iIndex) {
    oListbox.remove(iIndex);
};

ListUtil.clear = function (oListbox) {
    for (var i=oListbox.options.length-1; i >= 0; i--) {
        ListUtil.remove(oListbox, i);
    }
};

ListUtil.move = function (oListboxFrom, oListboxTo, iIndex) {
    var oOption = oListboxFrom.options[iIndex];

    if (oOption != null) {
        oListboxTo.appendChild(oOption);
    }
};

ListUtil.shiftUp = function (oListbox, iIndex) {
    if (iIndex > 0) {    
        var oOption = oListbox.options[iIndex];
        var oPrevOption = oListbox.options[iIndex-1];
        oListbox.insertBefore(oOption, oPrevOption);
    }    
};

ListUtil.shiftDown = function (oListbox, iIndex) {
    if (iIndex < oListbox.options.length - 1) {
        var oOption = oListbox.options[iIndex];
        var oNextOption = oListbox.options[iIndex+1];
        oListbox.insertBefore(oNextOption, oOption);
    }
};

var sUserAgent = navigator.userAgent;
var fAppVersion = parseFloat(navigator.appVersion);

function compareVersions(sVersion1, sVersion2) {

    var arrVersion1 = sVersion1.split(".");
    var arrVersion2 = sVersion2.split(".");
    
    if (arrVersion1.length > arrVersion2.length) {
        for (var i=0; i < arrVersion1.length - arrVersion2.length; i++) {
            arrVersion2.push("0");
        }
    } else if (arrVersion1.length < arrVersion2.length) {
        for (var i=0; i < arrVersion2.length - arrVersion1.length; i++) {
            arrVersion1.push("0");
        }    
    }
    
    for (var i=0; i < arrVersion1.length; i++) {
 
        if (arrVersion1[i] < arrVersion2[i]) {
            return -1;
        } else if (arrVersion1[i] > arrVersion2[i]) {
            return 1;
        }    
    }
    
    return 0;

}

var isOpera = sUserAgent.indexOf("Opera") > -1;
var isMinOpera4 = isMinOpera5 = isMinOpera6 = isMinOpera7 = isMinOpera7_5 = false;

if (isOpera) {
    var fOperaVersion;
    if(navigator.appName == "Opera") {
        fOperaVersion = fAppVersion;
    } else {
        var reOperaVersion = new RegExp("Opera (\\d+\\.\\d+)");
        reOperaVersion.test(sUserAgent);
        fOperaVersion = parseFloat(RegExp["$1"]);
    }

    isMinOpera4 = fOperaVersion >= 4;
    isMinOpera5 = fOperaVersion >= 5;
    isMinOpera6 = fOperaVersion >= 6;
    isMinOpera7 = fOperaVersion >= 7;
    isMinOpera7_5 = fOperaVersion >= 7.5;
}

var isKHTML = sUserAgent.indexOf("KHTML") > -1 
              || sUserAgent.indexOf("Konqueror") > -1 
              || sUserAgent.indexOf("AppleWebKit") > -1; 
              
var isMinSafari1 = isMinSafari1_2 = false;
var isMinKonq2_2 = isMinKonq3 = isMinKonq3_1 = isMinKonq3_2 = false;

if (isKHTML) {
    isSafari = sUserAgent.indexOf("AppleWebKit") > -1;
    isKonq = sUserAgent.indexOf("Konqueror") > -1;

    if (isSafari) {
        var reAppleWebKit = new RegExp("AppleWebKit\\/(\\d+(?:\\.\\d*)?)");
        reAppleWebKit.test(sUserAgent);
        var fAppleWebKitVersion = parseFloat(RegExp["$1"]);

        isMinSafari1 = fAppleWebKitVersion >= 85;
        isMinSafari1_2 = fAppleWebKitVersion >= 124;
    } else if (isKonq) {

        var reKonq = new RegExp("Konqueror\\/(\\d+(?:\\.\\d+(?:\\.\\d)?)?)");
        reKonq.test(sUserAgent);
        isMinKonq2_2 = compareVersions(RegExp["$1"], "2.2") >= 0;
        isMinKonq3 = compareVersions(RegExp["$1"], "3.0") >= 0;
        isMinKonq3_1 = compareVersions(RegExp["$1"], "3.1") >= 0;
        isMinKonq3_2 = compareVersions(RegExp["$1"], "3.2") >= 0;
    } 
    
}

var isIE = sUserAgent.indexOf("compatible") > -1 
           && sUserAgent.indexOf("MSIE") > -1
           && !isOpera;
           
var isMinIE4 = isMinIE5 = isMinIE5_5 = isMinIE6 = false;

if (isIE) {
    var reIE = new RegExp("MSIE (\\d+\\.\\d+);");
    reIE.test(sUserAgent);
    var fIEVersion = parseFloat(RegExp["$1"]);

    isMinIE4 = fIEVersion >= 4;
    isMinIE5 = fIEVersion >= 5;
    isMinIE5_5 = fIEVersion >= 5.5;
    isMinIE6 = fIEVersion >= 6.0;
}

var isMoz = sUserAgent.indexOf("Gecko") > -1
            && !isKHTML;
            
var isMinMoz1 = sMinMoz1_4 = isMinMoz1_5 = false;

if (isMoz) {
    var reMoz = new RegExp("rv:(\\d+\\.\\d+(?:\\.\\d+)?)");
    reMoz.test(sUserAgent);
    isMinMoz1 = compareVersions(RegExp["$1"], "1.0") >= 0;
    isMinMoz1_4 = compareVersions(RegExp["$1"], "1.4") >= 0;
    isMinMoz1_5 = compareVersions(RegExp["$1"], "1.5") >= 0;
}

var isNS4 = !isIE && !isOpera && !isMoz && !isKHTML 
            && (sUserAgent.indexOf("Mozilla") == 0) 
            && (navigator.appName == "Netscape") 
            && (fAppVersion >= 4.0 && fAppVersion < 5.0);

var isMinNS4 = isMinNS4_5 = isMinNS4_7 = isMinNS4_8 = false;

if (isNS4) {
    isMinNS4 = true;
    isMinNS4_5 = fAppVersion >= 4.5;
    isMinNS4_7 = fAppVersion >= 4.7;
    isMinNS4_8 = fAppVersion >= 4.8;
}

var isWin = (navigator.platform == "Win32") || (navigator.platform == "Windows");
var isMac = (navigator.platform == "Mac68K") || (navigator.platform == "MacPPC") 
            || (navigator.platform == "Macintosh");

var isUnix = (navigator.platform == "X11") && !isWin && !isMac;

var isWin95 = isWin98 = isWinNT4 = isWin2K = isWinME = isWinXP = false;
var isMac68K = isMacPPC = false;
var isSunOS = isMinSunOS4 = isMinSunOS5 = isMinSunOS5_5 = false;

if (isWin) {
    isWin95 = sUserAgent.indexOf("Win95") > -1 
              || sUserAgent.indexOf("Windows 95") > -1;
    isWin98 = sUserAgent.indexOf("Win98") > -1 
              || sUserAgent.indexOf("Windows 98") > -1;
    isWinME = sUserAgent.indexOf("Win 9x 4.90") > -1 
              || sUserAgent.indexOf("Windows ME") > -1;
    isWin2K = sUserAgent.indexOf("Windows NT 5.0") > -1 
              || sUserAgent.indexOf("Windows 2000") > -1;
    isWinXP = sUserAgent.indexOf("Windows NT 5.1") > -1 
              || sUserAgent.indexOf("Windows XP") > -1;
    isWinNT4 = sUserAgent.indexOf("WinNT") > -1 
              || sUserAgent.indexOf("Windows NT") > -1 
              || sUserAgent.indexOf("WinNT4.0") > -1 
              || sUserAgent.indexOf("Windows NT 4.0") > -1 
              && (!isWinME && !isWin2K && !isWinXP);
} 

if (isMac) {
    isMac68K = sUserAgent.indexOf("Mac_68000") > -1 
               || sUserAgent.indexOf("68K") > -1;
    isMacPPC = sUserAgent.indexOf("Mac_PowerPC") > -1 
               || sUserAgent.indexOf("PPC") > -1;  
}

if (isUnix) {
    isSunOS = sUserAgent.indexOf("SunOS") > -1;

    if (isSunOS) {
        var reSunOS = new RegExp("SunOS (\\d+\\.\\d+(?:\\.\\d+)?)");
        reSunOS.test(sUserAgent);
        isMinSunOS4 = compareVersions(RegExp["$1"], "4.0") >= 0;
        isMinSunOS5 = compareVersions(RegExp["$1"], "5.0") >= 0;
        isMinSunOS5_5 = compareVersions(RegExp["$1"], "5.5") >= 0;
    }
}
//Takes the prams out of the ure and puts thatn into the GET_DATA[] array
 GET_DATA=new Array();
    var getDataString=new String(window.location);
    var questionMarkLocation=getDataString.search(/\?/);
    if (questionMarkLocation!=-1){
      getDataString=getDataString.substr(questionMarkLocation+1);
      var getDataArray=getDataString.split(/&/g);
      for (var i=0;i<getDataArray.length;i++){
        var nameValuePair=getDataArray[i].split(/=/);
        GET_DATA[unescape(nameValuePair[0])]=unescape(nameValuePair[1]);
      }
    }function ucXpathMoz(){
	if (isMoz) {
		Element.prototype.selectNodes = function (sXPath) {
			var oEvaluator = new XPathEvaluator();
			var oResult = oEvaluator.evaluate(sXPath, ucXmlDom.documentElement, null, 
				XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);
       
			var aNodes = new Array;
                    
			if (oResult != null) {
				var oElement = oResult.iterateNext();
				while(oElement) {
					aNodes.push(oElement);
					oElement = oResult.iterateNext();
				}
			}
                   
			return aNodes;
               
		};
	}
}
/*---------------------------------------------------------*/
function setUserCollection(originalRequest){
	ucXmlDom = originalRequest.responseXML;
	getProducts();
}
/*---------------------------------------------------------
Instructions:
	insert the following function whereever you want to get a user generated collection
	getUserCollection(productNum, collectioId);
		productNum = the max number of products you want returned
		collectionId = the id of the desired user generated collection

/*---------------------------------------------------------*/
function getUserCollection(productNum, collectionId){
	var url = "/jsp/xml/getUserCollectionXML.jsp";
	var pars = "numProducts="+productNum+"&userCollectionId="+collectionId;
	var myAjax = new Ajax.Request(
		url, 
		{
			method: 'get', 
			parameters: pars, 
			onComplete: setUserCollection
							
		});
}
/*---------------------------------------------------------*/
function percent(x) { return Math.round((x-0)*100) + '%'; }
function getProducts(){
	prodArrayFixed = "";
	ucXpathMoz();
	var ucXmlDoc = ucXmlDom.documentElement; 
	var products = ucXmlDoc.selectNodes("//product");
	var _collectionId = ucXmlDoc.selectNodes("/userCollection/@id");
	var collId = _collectionId[0].nodeValue;
	var ucInsertString = "<ul>";
	ucInsertString += "<li>Collection id = "+_collectionId[0].nodeValue+"</li>";
	productArray.length = 0;
	//alert(products.length);
	//alert(products.length);
	for(i=0; i<products.length; i++){
		var id = products[i].attributes.getNamedItem("id").nodeValue;
		var url = products[i].attributes.getNamedItem("url").nodeValue;
		var imageUrl = products[i].attributes.getNamedItem("imageUrl").nodeValue;
		var brand = products[i].attributes.getNamedItem("brand").nodeValue;
		var price = products[i].attributes.getNamedItem("price").nodeValue;
		var percentOff = products[i].attributes.getNamedItem("percentOff").nodeValue;
		var pctoff =  percent(percentOff);
		// user these vars to greate the desired html string and apend it to ucInsertString

		
		gcItem(id,brand,price,pctoff,url,collId);
		//alert('hiS');
	}
	outputCollection();
	
}
/*---------------------------------------------------------*/

 function gfXpathMoz(){
	if (isMoz) {
		Element.prototype.selectNodes = function (sXPath) {
			var oEvaluator = new XPathEvaluator();
			var oResult = oEvaluator.evaluate(sXPath, gfXmlDom.documentElement, null, 
				XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);
       
			var aNodes = new Array;
                    
			if (oResult != null) {
				var oElement = oResult.iterateNext();
				while(oElement) {
					aNodes.push(oElement);
					oElement = oResult.iterateNext();
				}
			}
                   
			return aNodes;
               
		};
	}
}
/* --------------------------------------------------------------------- */
/*
Variables set by widget paramiters
	var treeId = 947;
	var GFALIGNMENT = "X";
	var baseURL = "/servlet/widgets/TW/detail/?cat=";
	var actionButtonLinkActive = "";
	var actionButtonLinkInactive = "";
*/
var depth = 0;
var gfXmlDom;
var GFDIV = "giftFinder";
var CATID = GET_DATA['cat'];
var currentBox = "";
/* --------------------------------------------------------------------- */
function SBGenorator(SBDivId, SBAlignment){
	var starterString = '<div class="GiftFinderSelectDivAlign';
	var midString = '"><select disabled="disabled" class="GiftFinderSelect" id="SB';
	var endString = '" name="GFSelect" onchange="javascript:loadNext(this.value);"><option value="all">Select</option></select></div>';
	var GFActionLink = '<div class="GiftFinderSelectDivAlign'+SBAlignment+'SubmitDiv" id="submit">'+actionButtonLinkInactive+'</div>';
	var GFInsertString = "";
	var SBCount = getDepth();
	//alert(SBCount);
	for(var i=0; i<SBCount; i++){
		var boxId = i+1;
		var GFSelectBox = starterString+SBAlignment+midString+boxId+endString+"\n";
		GFInsertString += GFSelectBox;
	}
	GFInsertString += GFActionLink;
	var GF = $(SBDivId);
	GF.innerHTML = GFInsertString;
	//alert("hi");
	loadFirstSB();
}
/* --------------------------------------------------------------------- */
function getDepth(){
	gfXpathMoz();
	var NextLevel = "/children/category";
	var StartLevel = "headCategory";
	//alert(gfXmlDom.documentElement);
	while(gfXmlDom.documentElement.selectNodes(StartLevel).length != 0){
		depth++;
		StartLevel += NextLevel;
	}
	//alert(depth);
	return depth;
}
/* --------------------------------------------------------------------- */
function loadFirstSB() {
	gfXpathMoz();
	var xmlDoc = gfXmlDom.documentElement;
	var NextLevel = "/children/category";
	var StartLevel = "headCategory";
		
	var categories = xmlDoc.selectNodes("headCategory");
	for(var i=0; i<categories.length; i++){
	
		var name = categories[i].attributes.getNamedItem("name").nodeValue;
		//alert(name);
		var id = categories[i].attributes.getNamedItem("id").nodeValue;
		//alert(id);
		var action = categories[i].attributes.getNamedItem("action").nodeValue;
		//alert(action);
		if(action != "null"){
		}else{
			action = baseURL+id;
		}
		
		ListUtil.add($("SB1"), name, id+","+"1");
	}
	$("SB1").disabled="";
	if(GET_DATA['cat'] && GET_DATA['follow'] && GET_DATA['follow'] == 'true'){	
		loadFromCat(CATID);
	}
}
/* --------------------------------------------------------------------- */
function xpathTest(id){
	gfXpathMoz();
	var StartLevel = "headCategory";
	var xmlDoc = gfXmlDom.documentElement;
	var categories = xmlDoc.selectNodes(StartLevel+'[@id="'+id+'"]/children/category/@id');
	var query = StartLevel+'[@id="'+id+'"]/@name';
	alert(query);
	alert(categories[0].nodeValue);
}
/* --------------------------------------------------------------------- */
function loadNext(id){
	gfXpathMoz();
	var xmlDoc = gfXmlDom.documentElement;
	var catId = id.substring(0,id.indexOf(","));
	var boxId = id.substring(id.indexOf(",")+1);
	var level = 1;
	var NextLevel = "/children/category";
	var getId = '[@id="'+catId+'"]';
	var getName = "/@name";
	var StartLevel = "headCategory";
	
	for(var i=0; i<depth; i++){
	
		var headNode = 	xmlDoc.selectNodes(StartLevel+getId);
		var listItems = $("SB"+level).options;	
	
		if(headNode.length != 0){
	
			var selectAction = headNode[0].attributes.getNamedItem("action").nodeValue;
			var childrenCheck = xmlDoc.selectNodes(StartLevel+getId+NextLevel+NextLevel)
			var hasChildren;
			var SBWLevel = level+1;
			var depthDiff = depth - level;
			var hasDirectChildren = headNode[0].hasChildNodes();
			var categories = xmlDoc.selectNodes(StartLevel+getId+NextLevel);
			
			if(listItems[0] && listItems[0].value == "all"){
				if ($("SB"+level).options.length > 1){
					ListUtil.remove($("SB"+level), 0);
				}
			}
			
			SetSelectAction(selectAction, catId);
					
			if(boxId == depth){
				break;
			}
			
			if(childrenCheck.length != 0){
				hasChildren = true;
			}else{
				hasChildren = false;
			}
	
			if(level != depth){
				for(var j=0; j<depthDiff; j++){
					var SBLevel = SBWLevel+j;
					ListUtil.clear($("SB"+SBLevel));
					ListUtil.add($("SB"+SBLevel), "Select", "all");
				}
			}
			
			if(hasDirectChildren == false){
				break;
			}
			
			if(hasChildren == false){
				$("SB"+depth).disabled="";
			}
			
			for(var j=0; j<categories.length; j++){
			
				var name = categories[j].attributes.getNamedItem("name").nodeValue;
				var nextId = categories[j].attributes.getNamedItem("id").nodeValue;
				var action = categories[j].attributes.getNamedItem("action").nodeValue;
				
				if(action != "null"){
				}else{
					action = baseURL+id;
				}
				if(hasChildren == false && level != depth){
					SBWLevel = depth;
				}
				
				$("SB"+SBWLevel).disabled="";
				ListUtil.add($("SB"+SBWLevel), name, nextId+","+SBWLevel);
			}
			currentBox = SBWLevel;
			break;
		}
		else {
			StartLevel+=NextLevel;
			level++;
		}
	}
	// alert(level);
	for(var i=0; i<=depth; i++){
		if($("SB"+i) && $("SB"+i).options.length <= 1){
			$("SB"+i).disabled="disabled";
		}
	}
}
/* --------------------------------------------------------------------- */
function loadFromCat(CATID){
	gfXpathMoz();
	if(isIE){
		gfXmlDom.setProperty("SelectionLanguage", "XPath");
	}
	var xmlDoc = gfXmlDom.documentElement;
	//var catFoundLevel;
	var contextNode = xmlDoc.selectNodes('//category[@id="'+CATID+'"]/ancestor-or-self::*/@id');
	//alert(contextNode.length);
	var catList = new Array();
	
	for(var i=0; i<contextNode.length; i++){
		if(contextNode[i].nodeValue !=  null){
			//alert(contextNode[i].nodeValue);
			catList[i] = contextNode[i].nodeValue;
			//alert(level);
			//level++
		}
	}
	for(var i=0; i<$("SB1").options.length; i++){
		var options = $("SB1").options;
		//alert(options[i].value);
		matchFirstCat = catList[1]+",1";
		//alert(matchFirstCat);
		if(options[i].value == CATID+",1"){
			options[i].selected="selected";
			loadNext(CATID+",1");
		}
		else if(options[i].value == matchFirstCat){
			options[i].selected="selected";
			if(contextNode.length>=1){
				loadNext(matchFirstCat);
			}
			
		}
	}
	//alert(contextNode.length);
	if(contextNode.length>=2){
		for(var j=0; j<contextNode.length; j++){
			var options = $("SB"+currentBox).options;
			var nextNode = contextNode[j].nodeValue+","+currentBox;
			//alert(options.length);
			//alert(nextNode);
			loadNext(nextNode);
			for(var i=0; i<options.length; i++){
				var testValue = options[i].value;
				var	testCat = testValue.substring(0,testValue.indexOf(","));
				if(testCat == contextNode[j].nodeValue){
					options[i].selected="selected";
					loadNext(testValue);
				}
			}
		}
		var lastOptions = $("SB"+currentBox).options;
		for(var i=0; i<lastOptions.length; i++){
			var testValue = lastOptions[i].value;
			var	testCat = testValue.substring(0,testValue.indexOf(","));
			if(testCat == CATID){
				lastOptions[i].selected="selected";
				loadNext(testValue);
			}
		}
		
	}
}
/* --------------------------------------------------------------------- */
function setCollectionTree(originalRequest){
	gfXmlDom = originalRequest.responseXML;
	//var responseT = originalRequest.responseText;
	//alert(responseT);
	//alert(gfXmlDom);
	SBGenorator(GFDIV, GFALIGNMENT);
 }
 /* --------------------------------------------------------------------- */
function getCollectionTree(){
	var url = "/jsp/xml/widgets/getTemplateNavTreeXML.jsp";
	var pars = "treeId=" + treeId;
	var myAjax = new Ajax.Request(
		url, 
		{
			method: 'get', 
			parameters: pars, 
			onComplete: setCollectionTree
		});
}
/* --------------------------------------------------------------------- */
function SetSelectAction(selectAction, catId){

	var SelectActionDiv = $("submit");
	var actionLink;

	if(selectAction != "null"){
		selectAction = selectAction+"&follow=true";
	}else{
		selectAction = baseURL+'?cat='+catId+"&follow=true";
	}
	
	actionLink = '<a href="'+selectAction+'">'+actionButtonLinkActive+'</a>';
	SelectActionDiv.innerHTML = actionLink;
}
/* --------------------------------------------------------------------- */
if (!webSitePrefix) {var webSitePrefix = "www";}
if (!SCW_collId) {var SCW_collId = "";}
if (!SCW_color) {var SCW_color = "blu";}
if (!SCW_size) {var SCW_size = "button";}
if (!SCW_collName) {var SCW_collName = "default";}
if (!SCW_collDesc) {var SCW_collDesc = "";}
if (!SCW_othersShowHide) {var SCW_othersShowHide = "none";}
if (!SCW_sharedCollections) {var SCW_sharedCollections = "null";}
if (!psCollection) {var psCollection = "";}
if (!prodImgPrefix) {var prodImgPrefix = "http://" + webSitePrefix + ".staticpersonalshopper.com/cached/thumbs/1/1/";}



function previewCollection() {
	var blidgetCodeBlock = document.blidgetForm.blidgetCode.value;
	if (!blidgetCodeBlock) {document.write(psCollection);}
	var collection = blidgetCodeBlock;
	document.write(collection);
}
function parseInput(_inputString){
	var collectionsUrl = "/servlet/widgets/collections/"
	var linkString = "";
	var arrInputString = _inputString.split(",");
	for(i=0; i<arrInputString.length; i++){
		var collId = "";
		var collName = "";
		
		collId = arrInputString[i];
		i++;
		collName = arrInputString[i];
		linkString += "<a href='"+collectionsUrl+"?collectionId="+collId+"' style='font-family:Arial, Helvetica, sans-serif; font-size:9px; text-decoration:none; color:#000000;'>"+collName+"</a><br />";
	}
	return linkString;
}
function ellipsis(x, maxlen)
{
/* given a string and a maximum length for the string, this routine
returns the same string truncated to the maximum length. In addition,
if the string was truncated, "..." is added to the end, again not to
exceed the maximum length.

E.g. ellipsis("abcdef", 4) = "a..."
ellipsis("abcdef", 6) = "abcdef"
*/

if (x.length <= maxlen)
return x
else if (maxlen < 4)
return x.substring(0, maxlen) // no room for ellipsis
else return x.substring(0, maxlen-3) + "...";
}

var productArray = new Array();
var prodArrayFixed = "";
function gcItem(id, brand, price, pctoff, url, collId) {
	this.id = id;
	this.brand = ellipsis(brand,14);
	this.price = price;
	this.pctoff = pctoff;
	var pctoffString = "";
	if (this.pctoff != null && this.pctoff != "0%" && this.pctoff.length > 0) {
		pctoffString = "<div style=\"font:bold 8pt Arial;color:#CC0000;width:70% height:15px;padding-left:10px;float:left;\">" + this.pctoff + "</div>";
	}
	else {
		pctoffString = "<div style=\"font:bold 8pt Arial;color:#CC0000;width:70% height:15px;padding-left:10px;float:left;\"></div>";
	}
	productArray.push("<div style=\"width:140px;height:215px;padding:5px 0px 10px 5px;float:left;\">" + 
					  "<div style=\"width:135px;height:170px;padding:0px 0px 5px 0px;border:none;\">" + 
					  "<a href=\"http://" + webSitePrefix + ".personalshopper.com" + url + "?productId=" + this.id + "&collectionId=" + SCW_collId + "\">" + 
					  "<img src=\"" + prodImgPrefix + this.id + "/_132x168.jpg" + "\" alt=\"\" border=\"0\" style=\"border:none;\" /></a></div>" + 
					  "<div style=\"width:135px;height:45px;padding:5px 0px 0px 5px;\">" + 
					  "<div style=\"font:bold 8pt Arial;color:#333333;width:100%;height:15px;padding:0px;white-space:no-wrap;\">" + this.brand + "</div><div style=\"\">" + 
					  "<div style=\"font:bold 8pt Arial;color:#333333;width:30%;height:15px;padding:0px;float:left;\">$" + this.price + "</div>" + pctoffString + "</div></div></div>");
	prodArrayFixed = productArray.join("");
}

function generateSCWcode(collectionId, name, size, color, description, otherCollections) {
	var productNum = 6;
	getUserCollection(productNum, collectionId);
	SCW_collId = collectionId;
	SCW_collName = name;
	SCW_size = size;
	SCW_color = color;
	SCW_collDesc = description;
	SCW_sharedCollections = parseInput(otherCollections);
	if (SCW_size == "Button") {
//		document.blidgetForm.blidgetDesc.disabled = true;
		if (otherCollections == "") {
			SCW_othersShowHide = "none";
		} else {
			SCW_othersShowHide = "block";
		}
	} else {
		if (SCW_size == "Inline") {
			if (otherCollections == "") {
				SCW_othersShowHide = "none";
			} else {
				SCW_othersShowHide = "block";
			}
		} else {
			if (SCW_size == "Sidebar") {
				if (otherCollections == "") {
					SCW_othersHeight = 80;
					SCW_othersShowHide = "none";
				} else {
					SCW_othersHeight = 135;
					SCW_othersShowHide = "block";
				}
			}
		}
	}
	if (SCW_color == "Blue") {
		SCW_color = "blu";
	} else {
		if (SCW_color == "Red") {
			SCW_color = "red";
		} else {
			if (SCW_color == "Black") {
				SCW_color = "blk";
		    }
		  }
	  }
}

function outputCollection() {
	var collectionsUrl = "/servlet/widgets/collections/"
	if (SCW_size == "Button") {
		psCollection = 
		"<div style=\"text-align:left;width:235px;\">" + 
		"<div style=\"background:url(" + staticServer + "/images/collections/SCW/SCW_B1_" + SCW_color + ".gif);height:73px;\">" + 
		"<div style=\"font:bold 10pt Arial;color:#FFFFFF;padding:53px 25px 0px 25px;\">" + 
		"<div style=\"float:left;overflow:hidden;\">" + SCW_collName + "</div>" + 
		"<div style=\"padding-top:3px;float:right;\">" +
		"<a href=\"http://" + webSitePrefix + ".personalshopper.com" + collectionsUrl + "?collectionId=" + SCW_collId + "\" style=\"font:normal 7pt Arial;color:#FFFFFF;\">view</a></div></div></div>" +
		"<div style=\"background:url(" + staticServer + "/images/collections/SCW/SCW_B2_" + SCW_color + ".gif);\">" + 
		"<div style=\"width:185px;padding-top:15px;height:33px;background:url(" + staticServer + "/images/collections/SCW/SCW_BOC.gif);margin:auto;display:" + SCW_othersShowHide + ";\">" + 
		"<div style=\"height:32px;overflow:auto;\">" + 
		"<div style=\"width:157px;padding:1px 5px 1px 5px;font:normal 8pt Arial;\">" + SCW_sharedCollections + "</div></div></div></div>" + 
		"<div style=\"background:url(" + staticServer + "/images/collections/SCW/SCW_B3_" + SCW_color + ".gif);height:54px;\">" + 
		"<div style=\"float:right;padding:12px 17px 0px 0px;\">" +
		"<a href=\"http://" + webSitePrefix + ".personalshopper.com\"><img src=\"" + staticServer + "/images/collections/blank.gif\" alt=\"\" style=\"width:94px;height:29px;border:none;\" /></a></div></div></div>";
	} else {
		if (SCW_size == "Inline") {
			psCollection = 
			"<div style=\"text-align:left;width:555px;\">" + 
			"<div style=\"background:url(" + staticServer + "/images/collections/SCW/SCW_I1_" + SCW_color + ".gif);height:84px;\">" + 
			"<div style=\"padding:25px 46px 0px 0px;float:right;\">" + 
			"<a href=\"http://" + webSitePrefix + ".personalshopper.com\"><img src=\"" + staticServer + "/images/collections/blank.gif\" alt=\"\" style=\"width:94px;height:29px;border:none;\" /></a></div>" + 
			"<div style=\"font:bold 10pt Arial;color:#FFFFFF;padding:65px 0px 0px 25px;\"><div style=\"overflow:hidden;\">" + SCW_collName + "</div></div></div>" + 
			"<div style=\"background:url(" + staticServer + "/images/collections/SCW/SCW_I2_" + SCW_color + ".gif);text-align:center;\">" + 
			"<div style=\"width:514px;height:200px;margin:auto;overflow:auto;\">" + 
			"<div style=\"width:487px;padding:1px 5px 1px 5px;font:normal 10pt Arial;\">" + prodArrayFixed + "</div></div></div>" + 
			"<div style=\"background:url(" + staticServer + "/images/collections/SCW/SCW_I3_" + SCW_color + ".gif);height:57px;text-align:left;\">" + 
			"<div style=\"padding-top:5px;\">" + 
			"<div style=\"width:514px;height:30px;margin:auto;overflow:auto;\">" + 
			"<div style=\"width:487px;padding:1px 5px 1px 5px;font:normal 9pt Arial;text-align:left;\">" + SCW_collDesc + "</div></div></div>" + 
			"<div style=\"padding:6px 0px 0px 420px;\">" +
			"<a href=\"http://" + webSitePrefix + ".personalshopper.com" + collectionsUrl + "?collectionId=" + SCW_collId + "\"><img src=\"" + staticServer + "/images/collections/blank.gif\" alt=\"\" style=\"width:110px;height:10px;border:none;\" /></a></div></div>" + 
			"<div style=\"background:url(" + staticServer + "/images/collections/SCW/SCW_I4_" + SCW_color + ".gif);height:58px;\">" + 
			"<div style=\"padding:13px 0px 0px 26px;float:left;\">" +
			"<a href=\"http://" + webSitePrefix + ".personalshopper.com/servlet/widgets/CustCare?ccp=war#CPSR0\"><img src=\"" + staticServer + "/images/collections/blank.gif\" alt=\"\" style=\"width:67px;height:9px;border:none;\" /></a>" + 
			"<div style=\"height:6px;width:1px;\"></div>" + 
			"<a href=\"http://" + webSitePrefix + ".personalshopper.com/servlet/widgets/CustCare?ccp=cmc\"><img src=\"" + staticServer + "/images/collections/blank.gif\" alt=\"\" style=\"width:82px;height:9px;border:none;\" /></a></div>" + 
			"<div style=\"padding-right:27px;float:right;display:" + SCW_othersShowHide + ";\">" + 
			"<div style=\"width:187px;padding-top:20px;background:url(" + staticServer + "/images/collections/SCW/SCW_OC.gif);\">" + 
			"<div style=\"height:32px;overflow:auto;\">" + 
			"<div style=\"width:157px;padding:1px 5px 1px 5px;font:normal 8pt Arial;\">" + SCW_sharedCollections + "</div></div></div></div></div></div>";
		} else {
			if (SCW_size == "Sidebar") {
				psCollection = 
				"<div style=\"text-align:left;width:235px;\">" + 
				"<div style=\"background:url(" + staticServer + "/images/collections/SCW/SCW_S1_" + SCW_color + ".gif);height:83px;\">" + 
				"<div style=\"font:bold 10pt Arial;color:#FFFFFF;padding:62px 25px 0px 25px;\"><div style=\"width:100%;overflow:hidden;\">" + SCW_collName + "</div></div></div>" + 
				"<div style=\"background:url(" + staticServer + "/images/collections/SCW/SCW_S2_" + SCW_color + ".gif);text-align:center;\">" + 
				"<div style=\"width:201px;height:500px;margin:auto;overflow:auto;\">" + 
				"<div style=\"width:174px;padding:1px 5px 1px 5px;font:normal 10pt Arial;\">" + prodArrayFixed + "</div></div></div>" + 
				"<div style=\"background:url(" + staticServer + "/images/collections/SCW/SCW_S3_" + SCW_color + ".gif);height:81px;text-align:center;\">" + 
				"<div style=\"padding-top:5px;\">" + "<div style=\"width:201px;height:52px;margin:auto;overflow:auto;\">" + 
				"<div style=\"width:174px;padding:1px 5px 1px 5px;font:normal 9pt Arial;text-align:left;\">" + SCW_collDesc + "</div></div></div>" + 
				"<div style=\"padding:7px 0px 0px 103px;\">" +
				"<a href=\"http://" + webSitePrefix + ".personalshopper.com" + collectionsUrl + "?collectionId=" + SCW_collId + "\"><img src=\"" + staticServer + "/images/collections/blank.gif\" alt=\"\" style=\"width:110px;height:10px;border:none;\" /></a></div></div>" + 
				"<div style=\"background:url(" + staticServer + "/images/collections/SCW/SCW_S4_" + SCW_color + ".gif) bottom;height:" + SCW_othersHeight + "px;\">" + 
				"<div style=\"padding-top:19px;display:" + SCW_othersShowHide + ";\">" + 
				"<div style=\"width:185px;height:32px;margin:auto;overflow:auto;\">" + 
				"<div style=\"width:157px;padding:1px 5px 1px 5px;font:normal 8pt Arial;\">" + SCW_sharedCollections + "</div></div></div><div>" + 
				"<div style=\"padding:30px 0px 0px 21px;float:left;\">" + 
				"<a href=\"http://" + webSitePrefix + ".personalshopper.com/servlet/widgets/CustCare?ccp=war#CPSR0\"><img src=\"" + staticServer + "/images/collections/blank.gif\" alt=\"\" style=\"width:67px;height:9px;border:none;\" /></a>" + 
				"<div style=\"height:6px;width:1px;\"></div>" + 
				"<a href=\"http:" + webSitePrefix + ".personalshopper.com/servlet/widgets/CustCare?ccp=cmc\"><img src=\"" + staticServer + "/images/collections/blank.gif\" alt=\"\" style=\"width:82px;height:9px;border:none;\" /></a></div>" + 
				"<div style=\"padding:23px 0px 0px 17px;float:left;\">" + 
				"<a href=\"http://" + webSitePrefix + ".personalshopper.com\"><img src=\"" + staticServer + "/images/collections/blank.gif\" alt=\"\" style=\"width:94px;height:29px;border:none;\" /></a></div></div></div></div>";
			}
		}
	}
	window.returnCommunityWidgetToGWT(psCollection);
}

/**
 * ====================================================================
 * About Sarissa: http://dev.abiss.gr/sarissa
 * ====================================================================
 * Sarissa is an ECMAScript library acting as a cross-browser wrapper for native XML APIs.
 * The library supports Gecko based browsers like Mozilla and Firefox,
 * Internet Explorer (5.5+ with MSXML3.0+), Konqueror, Safari and Opera
 * @author: @author: Copyright 2004-2007 Emmanouil Batsis, mailto: mbatsis at users full stop sourceforge full stop net
 * ====================================================================
 * Licence
 * ====================================================================
 * Sarissa is free software distributed under the GNU GPL version 2 (see <a href="gpl.txt">gpl.txt</a>) or higher,
 * GNU LGPL version 2.1 (see <a href="lgpl.txt">lgpl.txt</a>) or higher and Apache Software License 2.0 or higher
 * (see <a href="asl.txt">asl.txt</a>). This means you can choose one of the three and use that if you like. If
 * you make modifications under the ASL, i would appreciate it if you submitted those.
 * In case your copy of Sarissa does not include the license texts, you may find
 * them online in various formats at <a href="http://www.gnu.org">http://www.gnu.org</a> and
 * <a href="http://www.apache.org">http://www.apache.org</a>.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
 * KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
 * WARRANTIES OF MERCHANTABILITY,FITNESS FOR A PARTICULAR PURPOSE
 * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */
/**
 * <p>Sarissa is a utility class. Provides "static" methods for DOMDocument,
 * DOM Node serialization to XML strings and other utility goodies.</p>
 * @constructor
 * @static
 */
function Sarissa(){}
Sarissa.VERSION = "0.9.9";
Sarissa.PARSED_OK = "Document contains no parsing errors";
Sarissa.PARSED_EMPTY = "Document is empty";
Sarissa.PARSED_UNKNOWN_ERROR = "Not well-formed or other error";
Sarissa.IS_ENABLED_TRANSFORM_NODE = false;
Sarissa.REMOTE_CALL_FLAG = "gr.abiss.sarissa.REMOTE_CALL_FLAG";
/** @private */
Sarissa._sarissa_iNsCounter = 0;
/** @private */
Sarissa._SARISSA_IEPREFIX4XSLPARAM = "";
/** @private */
Sarissa._SARISSA_HAS_DOM_IMPLEMENTATION = document.implementation && true;
/** @private */
Sarissa._SARISSA_HAS_DOM_CREATE_DOCUMENT = Sarissa._SARISSA_HAS_DOM_IMPLEMENTATION && document.implementation.createDocument;
/** @private */
Sarissa._SARISSA_HAS_DOM_FEATURE = Sarissa._SARISSA_HAS_DOM_IMPLEMENTATION && document.implementation.hasFeature;
/** @private */
Sarissa._SARISSA_IS_MOZ = Sarissa._SARISSA_HAS_DOM_CREATE_DOCUMENT && Sarissa._SARISSA_HAS_DOM_FEATURE;
/** @private */
Sarissa._SARISSA_IS_SAFARI = navigator.userAgent.toLowerCase().indexOf("safari") != -1 || navigator.userAgent.toLowerCase().indexOf("konqueror") != -1;
/** @private */
Sarissa._SARISSA_IS_SAFARI_OLD = Sarissa._SARISSA_IS_SAFARI && (parseInt((navigator.userAgent.match(/AppleWebKit\/(\d+)/)||{})[1], 10) < 420);
/** @private */
Sarissa._SARISSA_IS_IE = document.all && window.ActiveXObject && navigator.userAgent.toLowerCase().indexOf("msie") > -1  && navigator.userAgent.toLowerCase().indexOf("opera") == -1;
/** @private */
Sarissa._SARISSA_IS_OPERA = navigator.userAgent.toLowerCase().indexOf("opera") != -1;
if(!window.Node || !Node.ELEMENT_NODE){
    Node = {ELEMENT_NODE: 1, ATTRIBUTE_NODE: 2, TEXT_NODE: 3, CDATA_SECTION_NODE: 4, ENTITY_REFERENCE_NODE: 5,  ENTITY_NODE: 6, PROCESSING_INSTRUCTION_NODE: 7, COMMENT_NODE: 8, DOCUMENT_NODE: 9, DOCUMENT_TYPE_NODE: 10, DOCUMENT_FRAGMENT_NODE: 11, NOTATION_NODE: 12};
}

//This breaks for(x in o) loops in the old Safari
if(Sarissa._SARISSA_IS_SAFARI_OLD){
	HTMLHtmlElement = document.createElement("html").constructor;
	Node = HTMLElement = {};
	HTMLElement.prototype = HTMLHtmlElement.__proto__.__proto__;
	HTMLDocument = Document = document.constructor;
	var x = new DOMParser();
	XMLDocument = x.constructor;
	Element = x.parseFromString("<Single />", "text/xml").documentElement.constructor;
	x = null;
}
if(typeof XMLDocument == "undefined" && typeof Document !="undefined"){ XMLDocument = Document; }

// IE initialization
if(Sarissa._SARISSA_IS_IE){
    // for XSLT parameter names, prefix needed by IE
    Sarissa._SARISSA_IEPREFIX4XSLPARAM = "xsl:";
    // used to store the most recent ProgID available out of the above
    var _SARISSA_DOM_PROGID = "";
    var _SARISSA_XMLHTTP_PROGID = "";
    var _SARISSA_DOM_XMLWRITER = "";
    /**
     * Called when the sarissa.js file is parsed, to pick most recent
     * ProgIDs for IE, then gets destroyed.
     * @memberOf Sarissa
     * @private
     * @param idList an array of MSXML PROGIDs from which the most recent will be picked for a given object
     * @param enabledList an array of arrays where each array has two items; the index of the PROGID for which a certain feature is enabled
     */
    Sarissa.pickRecentProgID = function (idList){
        // found progID flag
        var bFound = false, e;
        var o2Store;
        for(var i=0; i < idList.length && !bFound; i++){
            try{
                var oDoc = new ActiveXObject(idList[i]);
                o2Store = idList[i];
                bFound = true;
            }catch (objException){
                // trap; try next progID
                e = objException;
            }
        }
        if (!bFound) {
            throw "Could not retrieve a valid progID of Class: " + idList[idList.length-1]+". (original exception: "+e+")";
        }
        idList = null;
        return o2Store;
    };
    // pick best available MSXML progIDs
    _SARISSA_DOM_PROGID = null;
    _SARISSA_THREADEDDOM_PROGID = null;
    _SARISSA_XSLTEMPLATE_PROGID = null;
    _SARISSA_XMLHTTP_PROGID = null;
    if(!window.XMLHttpRequest){
        /**
         * Emulate XMLHttpRequest
         * @constructor
         */
        XMLHttpRequest = function() {
            if(!_SARISSA_XMLHTTP_PROGID){
                _SARISSA_XMLHTTP_PROGID = Sarissa.pickRecentProgID(["Msxml2.XMLHTTP.6.0", "MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP", "Microsoft.XMLHTTP"]);
            }
            return new ActiveXObject(_SARISSA_XMLHTTP_PROGID);
        };
    }
    // we dont need this anymore
    //============================================
    // Factory methods (IE)
    //============================================
    // see non-IE version
    Sarissa.getDomDocument = function(sUri, sName){
        if(!_SARISSA_DOM_PROGID){
            _SARISSA_DOM_PROGID = Sarissa.pickRecentProgID(["Msxml2.DOMDocument.6.0", "Msxml2.DOMDocument.3.0", "MSXML2.DOMDocument", "MSXML.DOMDocument", "Microsoft.XMLDOM"]);
        }
        var oDoc = new ActiveXObject(_SARISSA_DOM_PROGID);
        // if a root tag name was provided, we need to load it in the DOM object
        if (sName){
            // create an artifical namespace prefix
            // or reuse existing prefix if applicable
            var prefix = "";
            if(sUri){
                if(sName.indexOf(":") > 1){
                    prefix = sName.substring(0, sName.indexOf(":"));
                    sName = sName.substring(sName.indexOf(":")+1);
                }else{
                    prefix = "a" + (Sarissa._sarissa_iNsCounter++);
                }
            }
            // use namespaces if a namespace URI exists
            if(sUri){
                oDoc.loadXML('<' + prefix+':'+sName + " xmlns:" + prefix + "=\"" + sUri + "\"" + " />");
            } else {
                oDoc.loadXML('<' + sName + " />");
            }
        }
        return oDoc;
    };
    // see non-IE version
    Sarissa.getParseErrorText = function (oDoc) {
        var parseErrorText = Sarissa.PARSED_OK;
        if(oDoc && oDoc.parseError && oDoc.parseError.errorCode && oDoc.parseError.errorCode !== 0){
            parseErrorText = "XML Parsing Error: " + oDoc.parseError.reason +
                "\\nLocation: " + oDoc.parseError.url +
                "\\nLine Number " + oDoc.parseError.line + ", Column " +
                oDoc.parseError.linepos +
                ":\\n" + oDoc.parseError.srcText +
                "\\n";
            for(var i = 0;  i < oDoc.parseError.linepos;i++){
                parseErrorText += "-";
            }
            parseErrorText +=  "^\\n";
        }
        else if(oDoc.documentElement === null){
            parseErrorText = Sarissa.PARSED_EMPTY;
        }
        return parseErrorText;
    };
    // see non-IE version
    Sarissa.setXpathNamespaces = function(oDoc, sNsSet) {
        oDoc.setProperty("SelectionLanguage", "XPath");
        oDoc.setProperty("SelectionNamespaces", sNsSet);
    };
    /**
     * An implementation of Mozilla's XSLTProcessor for IE.
     * Reuses the same XSLT stylesheet for multiple transforms
     * @constructor
     */
    XSLTProcessor = function(){
        if(!_SARISSA_XSLTEMPLATE_PROGID){
            _SARISSA_XSLTEMPLATE_PROGID = Sarissa.pickRecentProgID(["Msxml2.XSLTemplate.6.0", "MSXML2.XSLTemplate.3.0"]);
        }
        this.template = new ActiveXObject(_SARISSA_XSLTEMPLATE_PROGID);
        this.processor = null;
    };
    /**
     * Imports the given XSLT DOM and compiles it to a reusable transform
     * <b>Note:</b> If the stylesheet was loaded from a URL and contains xsl:import or xsl:include elements,it will be reloaded to resolve those
     * @argument xslDoc The XSLT DOMDocument to import
     */
    XSLTProcessor.prototype.importStylesheet = function(xslDoc){
        if(!_SARISSA_THREADEDDOM_PROGID){
            _SARISSA_THREADEDDOM_PROGID = Sarissa.pickRecentProgID(["MSXML2.FreeThreadedDOMDocument.6.0", "MSXML2.FreeThreadedDOMDocument.3.0"]);
        }
        xslDoc.setProperty("SelectionLanguage", "XPath");
        xslDoc.setProperty("SelectionNamespaces", "xmlns:xsl='http://www.w3.org/1999/XSL/Transform'");
        // convert stylesheet to free threaded
        var converted = new ActiveXObject(_SARISSA_THREADEDDOM_PROGID);
        // make included/imported stylesheets work if exist and xsl was originally loaded from url
        try{
            converted.resolveExternals = true;
            converted.setProperty("AllowDocumentFunction", true);
        }
        catch(e){
            // Ignore. "AllowDocumentFunction" is only supported in MSXML 3.0 SP4 and later.
        }
        if(xslDoc.url && xslDoc.selectSingleNode("//xsl:*[local-name() = 'import' or local-name() = 'include']") !== null){
            converted.async = false;
            converted.load(xslDoc.url);
        }
        else {
            converted.loadXML(xslDoc.xml);
        }
        converted.setProperty("SelectionNamespaces", "xmlns:xsl='http://www.w3.org/1999/XSL/Transform'");
        var output = converted.selectSingleNode("//xsl:output");
        //this.outputMethod = output ? output.getAttribute("method") : "html";
        if(output) {
            this.outputMethod = output.getAttribute("method");
        }
        else {
            delete this.outputMethod;
        }
        this.template.stylesheet = converted;
        this.processor = this.template.createProcessor();
        // for getParameter and clearParameters
        this.paramsSet = [];
    };

    /**
     * Transform the given XML DOM and return the transformation result as a new DOM document
     * @argument sourceDoc The XML DOMDocument to transform
     * @return The transformation result as a DOM Document
     */
    XSLTProcessor.prototype.transformToDocument = function(sourceDoc){
        // fix for bug 1549749
        var outDoc;
        if(_SARISSA_THREADEDDOM_PROGID){
            this.processor.input=sourceDoc;
            outDoc=new ActiveXObject(_SARISSA_DOM_PROGID);
            this.processor.output=outDoc;
            this.processor.transform();
            return outDoc;
        }
        else{
            if(!_SARISSA_DOM_XMLWRITER){
                _SARISSA_DOM_XMLWRITER = Sarissa.pickRecentProgID(["Msxml2.MXXMLWriter.6.0", "Msxml2.MXXMLWriter.3.0", "MSXML2.MXXMLWriter", "MSXML.MXXMLWriter", "Microsoft.XMLDOM"]);
            }
            this.processor.input = sourceDoc;
            outDoc = new ActiveXObject(_SARISSA_DOM_XMLWRITER);
            this.processor.output = outDoc;
            this.processor.transform();
            var oDoc = new ActiveXObject(_SARISSA_DOM_PROGID);
            oDoc.loadXML(outDoc.output+"");
            return oDoc;
        }
    };

    /**
     * Transform the given XML DOM and return the transformation result as a new DOM fragment.
     * <b>Note</b>: The xsl:output method must match the nature of the owner document (XML/HTML).
     * @argument sourceDoc The XML DOMDocument to transform
     * @argument ownerDoc The owner of the result fragment
     * @return The transformation result as a DOM Document
     */
    XSLTProcessor.prototype.transformToFragment = function (sourceDoc, ownerDoc) {
        this.processor.input = sourceDoc;
        this.processor.transform();
        var s = this.processor.output;
        var f = ownerDoc.createDocumentFragment();
        var container;
        if (this.outputMethod == 'text') {
            f.appendChild(ownerDoc.createTextNode(s));
        } else if (ownerDoc.body && ownerDoc.body.innerHTML) {
            container = ownerDoc.createElement('div');
            container.innerHTML = s;
            while (container.hasChildNodes()) {
                f.appendChild(container.firstChild);
            }
        }
        else {
            var oDoc = new ActiveXObject(_SARISSA_DOM_PROGID);
            if (s.substring(0, 5) == '<?xml') {
                s = s.substring(s.indexOf('?>') + 2);
            }
            var xml = ''.concat('<my>', s, '</my>');
            oDoc.loadXML(xml);
            container = oDoc.documentElement;
            while (container.hasChildNodes()) {
                f.appendChild(container.firstChild);
            }
        }
        return f;
    };

    /**
     * Set global XSLT parameter of the imported stylesheet
     * @argument nsURI The parameter namespace URI
     * @argument name The parameter base name
     * @argument value The new parameter value
     */
     XSLTProcessor.prototype.setParameter = function(nsURI, name, value){
         // make value a zero length string if null to allow clearing
         value = value ? value : "";
         // nsURI is optional but cannot be null
         if(nsURI){
             this.processor.addParameter(name, value, nsURI);
         }else{
             this.processor.addParameter(name, value);
         }
         // update updated params for getParameter
         nsURI = "" + (nsURI || "");
         if(!this.paramsSet[nsURI]){
             this.paramsSet[nsURI] = [];
         }
         this.paramsSet[nsURI][name] = value;
     };
    /**
     * Gets a parameter if previously set by setParameter. Returns null
     * otherwise
     * @argument name The parameter base name
     * @argument value The new parameter value
     * @return The parameter value if reviously set by setParameter, null otherwise
     */
    XSLTProcessor.prototype.getParameter = function(nsURI, name){
        nsURI = "" + (nsURI || "");
        if(this.paramsSet[nsURI] && this.paramsSet[nsURI][name]){
            return this.paramsSet[nsURI][name];
        }else{
            return null;
        }
    };

    /**
     * Clear parameters (set them to default values as defined in the stylesheet itself)
     */
    XSLTProcessor.prototype.clearParameters = function(){
        for(var nsURI in this.paramsSet){
            for(var name in this.paramsSet[nsURI]){
                if(nsURI!==""){
                    this.processor.addParameter(name, "", nsURI);
                }else{
                    this.processor.addParameter(name, "");
                }
            }
        }
        this.paramsSet = [];
    };
}else{ /* end IE initialization, try to deal with real browsers now ;-) */
    if(Sarissa._SARISSA_HAS_DOM_CREATE_DOCUMENT){
        /**
         * <p>Ensures the document was loaded correctly, otherwise sets the
         * parseError to -1 to indicate something went wrong. Internal use</p>
         * @private
         */
        Sarissa.__handleLoad__ = function(oDoc){
            Sarissa.__setReadyState__(oDoc, 4);
        };
        /**
        * <p>Attached by an event handler to the load event. Internal use.</p>
        * @private
        */
        _sarissa_XMLDocument_onload = function(){
            Sarissa.__handleLoad__(this);
        };
        /**
         * <p>Sets the readyState property of the given DOM Document object.
         * Internal use.</p>
         * @memberOf Sarissa
         * @private
         * @argument oDoc the DOM Document object to fire the
         *          readystatechange event
         * @argument iReadyState the number to change the readystate property to
         */
        Sarissa.__setReadyState__ = function(oDoc, iReadyState){
            oDoc.readyState = iReadyState;
            oDoc.readystate = iReadyState;
            if (oDoc.onreadystatechange !== null && typeof oDoc.onreadystatechange == "function") {
                oDoc.onreadystatechange();
            }
        };

        Sarissa.getDomDocument = function(sUri, sName){
            var oDoc = document.implementation.createDocument(sUri?sUri:null, sName?sName:null, null);
            if(!oDoc.onreadystatechange){

                /**
                * <p>Emulate IE's onreadystatechange attribute</p>
                */
                oDoc.onreadystatechange = null;
            }
            if(!oDoc.readyState){
                /**
                * <p>Emulates IE's readyState property, which always gives an integer from 0 to 4:</p>
                * <ul><li>1 == LOADING,</li>
                * <li>2 == LOADED,</li>
                * <li>3 == INTERACTIVE,</li>
                * <li>4 == COMPLETED</li></ul>
                */
                oDoc.readyState = 0;
            }
            oDoc.addEventListener("load", _sarissa_XMLDocument_onload, false);
            return oDoc;
        };
        if(window.XMLDocument){
            // do nothing
        }// TODO: check if the new document has content before trying to copynodes, check  for error handling in DOM 3 LS
        else if(Sarissa._SARISSA_HAS_DOM_FEATURE && window.Document && !Document.prototype.load && document.implementation.hasFeature('LS', '3.0')){
    		//Opera 9 may get the XPath branch which gives creates XMLDocument, therefore it doesn't reach here which is good
            /**
            * <p>Factory method to obtain a new DOM Document object</p>
            * @memberOf Sarissa
            * @argument sUri the namespace of the root node (if any)
            * @argument sUri the local name of the root node (if any)
            * @returns a new DOM Document
            */
            Sarissa.getDomDocument = function(sUri, sName){
                var oDoc = document.implementation.createDocument(sUri?sUri:null, sName?sName:null, null);
                return oDoc;
            };
        }
        else {
            Sarissa.getDomDocument = function(sUri, sName){
                var oDoc = document.implementation.createDocument(sUri?sUri:null, sName?sName:null, null);
                // looks like safari does not create the root element for some unknown reason
                if(oDoc && (sUri || sName) && !oDoc.documentElement){
                    oDoc.appendChild(oDoc.createElementNS(sUri, sName));
                }
                return oDoc;
            };
        }
    }//if(Sarissa._SARISSA_HAS_DOM_CREATE_DOCUMENT)
}
//==========================================
// Common stuff
//==========================================
if(!window.DOMParser){
    if(Sarissa._SARISSA_IS_SAFARI){
        /*
         * DOMParser is a utility class, used to construct DOMDocuments from XML strings
         * @constructor
         */
        DOMParser = function() { };
        /**
        * Construct a new DOM Document from the given XMLstring
        * @param sXml the given XML string
        * @param contentType the content type of the document the given string represents (one of text/xml, application/xml, application/xhtml+xml).
        * @return a new DOM Document from the given XML string
        */
        DOMParser.prototype.parseFromString = function(sXml, contentType){
            var xmlhttp = new XMLHttpRequest();
            xmlhttp.open("GET", "data:text/xml;charset=utf-8," + encodeURIComponent(sXml), false);
            xmlhttp.send(null);
            return xmlhttp.responseXML;
        };
    }else if(Sarissa.getDomDocument && Sarissa.getDomDocument() && Sarissa.getDomDocument(null, "bar").xml){
        DOMParser = function() { };
        DOMParser.prototype.parseFromString = function(sXml, contentType){
            var doc = Sarissa.getDomDocument();
            doc.loadXML(sXml);
            return doc;
        };
    }
}

if((typeof(document.importNode) == "undefined") && Sarissa._SARISSA_IS_IE){
    try{
        /**
        * Implementation of importNode for the context window document in IE.
        * If <code>oNode</code> is a TextNode, <code>bChildren</code> is ignored.
        * @param oNode the Node to import
        * @param bChildren whether to include the children of oNode
        * @returns the imported node for further use
        */
        document.importNode = function(oNode, bChildren){
            var tmp;
            if (oNode.nodeName=='#text') {
                return document.createTextNode(oNode.data);
            }
            else {
                if(oNode.nodeName == "tbody" || oNode.nodeName == "tr"){
                    tmp = document.createElement("table");
                }
                else if(oNode.nodeName == "td"){
                    tmp = document.createElement("tr");
                }
                else if(oNode.nodeName == "option"){
                    tmp = document.createElement("select");
                }
                else{
                    tmp = document.createElement("div");
                }
                if(bChildren){
                    tmp.innerHTML = oNode.xml ? oNode.xml : oNode.outerHTML;
                }else{
                    tmp.innerHTML = oNode.xml ? oNode.cloneNode(false).xml : oNode.cloneNode(false).outerHTML;
                }
                return tmp.getElementsByTagName("*")[0];
            }
        };
    }catch(e){ }
}
if(!Sarissa.getParseErrorText){
    /**
     * <p>Returns a human readable description of the parsing error. Usefull
     * for debugging. Tip: append the returned error string in a &lt;pre&gt;
     * element if you want to render it.</p>
     * <p>Many thanks to Christian Stocker for the initial patch.</p>
     * @memberOf Sarissa
     * @argument oDoc The target DOM document
     * @returns The parsing error description of the target Document in
     *          human readable form (preformated text)
     */
    Sarissa.getParseErrorText = function (oDoc){
        var parseErrorText = Sarissa.PARSED_OK;
        if(!oDoc.documentElement){
            parseErrorText = Sarissa.PARSED_EMPTY;
        } else if(oDoc.documentElement.tagName == "parsererror"){
            parseErrorText = oDoc.documentElement.firstChild.data;
            parseErrorText += "\\n" +  oDoc.documentElement.firstChild.nextSibling.firstChild.data;
        } else if(oDoc.getElementsByTagName("parsererror").length > 0){
            var parsererror = oDoc.getElementsByTagName("parsererror")[0];
            parseErrorText = Sarissa.getText(parsererror, true)+"\\n";
        } else if(oDoc.parseError && oDoc.parseError.errorCode !== 0){
            parseErrorText = Sarissa.PARSED_UNKNOWN_ERROR;
        }
        return parseErrorText;
    };
}
/**
 * Get a string with the concatenated values of all string nodes under the given node
 * @memberOf Sarissa
 * @argument oNode the given DOM node
 * @argument deep whether to recursively scan the children nodes of the given node for text as well. Default is <code>false</code>
 */
Sarissa.getText = function(oNode, deep){
    var s = "";
    var nodes = oNode.childNodes;
    for(var i=0; i < nodes.length; i++){
        var node = nodes[i];
        var nodeType = node.nodeType;
        if(nodeType == Node.TEXT_NODE || nodeType == Node.CDATA_SECTION_NODE){
            s += node.data;
        } else if(deep === true && (nodeType == Node.ELEMENT_NODE || nodeType == Node.DOCUMENT_NODE || nodeType == Node.DOCUMENT_FRAGMENT_NODE)){
            s += Sarissa.getText(node, true);
        }
    }
    return s;
};
if(!window.XMLSerializer && Sarissa.getDomDocument && Sarissa.getDomDocument("","foo", null).xml){
    /**
     * Utility class to serialize DOM Node objects to XML strings
     * @constructor
     */
    XMLSerializer = function(){};
    /**
     * Serialize the given DOM Node to an XML string
     * @param oNode the DOM Node to serialize
     */
    XMLSerializer.prototype.serializeToString = function(oNode) {
        return oNode.xml;
    };
}

/**
 * Strips tags from the given markup string
 * @memberOf Sarissa
 */
Sarissa.stripTags = function (s) {
    return s.replace(/<[^>]+>/g,"");
};
/**
 * <p>Deletes all child nodes of the given node</p>
 * @memberOf Sarissa
 * @argument oNode the Node to empty
 */
Sarissa.clearChildNodes = function(oNode) {
    // need to check for firstChild due to opera 8 bug with hasChildNodes
    while(oNode.firstChild) {
        oNode.removeChild(oNode.firstChild);
    }
};
/**
 * <p> Copies the childNodes of nodeFrom to nodeTo</p>
 * <p> <b>Note:</b> The second object's original content is deleted before
 * the copy operation, unless you supply a true third parameter</p>
 * @memberOf Sarissa
 * @argument nodeFrom the Node to copy the childNodes from
 * @argument nodeTo the Node to copy the childNodes to
 * @argument bPreserveExisting whether to preserve the original content of nodeTo, default is false
 */
Sarissa.copyChildNodes = function(nodeFrom, nodeTo, bPreserveExisting) {
    if(Sarissa._SARISSA_IS_SAFARI && nodeTo.nodeType == Node.DOCUMENT_NODE){ // SAFARI_OLD ??
    	nodeTo = nodeTo.documentElement; //Appearantly there's a bug in safari where you can't appendChild to a document node
    }

    if((!nodeFrom) || (!nodeTo)){
        throw "Both source and destination nodes must be provided";
    }
    if(!bPreserveExisting){
        Sarissa.clearChildNodes(nodeTo);
    }
    var ownerDoc = nodeTo.nodeType == Node.DOCUMENT_NODE ? nodeTo : nodeTo.ownerDocument;
    var nodes = nodeFrom.childNodes;
    var i;
    if(typeof(ownerDoc.importNode) != "undefined")  {
        for(i=0;i < nodes.length;i++) {
            nodeTo.appendChild(ownerDoc.importNode(nodes[i], true));
        }
    } else {
        for(i=0;i < nodes.length;i++) {
            nodeTo.appendChild(nodes[i].cloneNode(true));
        }
    }
};

/**
 * <p> Moves the childNodes of nodeFrom to nodeTo</p>
 * <p> <b>Note:</b> The second object's original content is deleted before
 * the move operation, unless you supply a true third parameter</p>
 * @memberOf Sarissa
 * @argument nodeFrom the Node to copy the childNodes from
 * @argument nodeTo the Node to copy the childNodes to
 * @argument bPreserveExisting whether to preserve the original content of nodeTo, default is
 */
Sarissa.moveChildNodes = function(nodeFrom, nodeTo, bPreserveExisting) {
    if((!nodeFrom) || (!nodeTo)){
        throw "Both source and destination nodes must be provided";
    }
    if(!bPreserveExisting){
        Sarissa.clearChildNodes(nodeTo);
    }
    var nodes = nodeFrom.childNodes;
    // if within the same doc, just move, else copy and delete
    if(nodeFrom.ownerDocument == nodeTo.ownerDocument){
        while(nodeFrom.firstChild){
            nodeTo.appendChild(nodeFrom.firstChild);
        }
    } else {
        var ownerDoc = nodeTo.nodeType == Node.DOCUMENT_NODE ? nodeTo : nodeTo.ownerDocument;
        var i;
        if(typeof(ownerDoc.importNode) != "undefined") {
           for(i=0;i < nodes.length;i++) {
               nodeTo.appendChild(ownerDoc.importNode(nodes[i], true));
           }
        }else{
           for(i=0;i < nodes.length;i++) {
               nodeTo.appendChild(nodes[i].cloneNode(true));
           }
        }
        Sarissa.clearChildNodes(nodeFrom);
    }
};

/**
 * <p>Serialize any <strong>non</strong> DOM object to an XML string. All properties are serialized using the property name
 * as the XML element name. Array elements are rendered as <code>array-item</code> elements,
 * using their index/key as the value of the <code>key</code> attribute.</p>
 * @memberOf Sarissa
 * @argument anyObject the object to serialize
 * @argument objectName a name for that object
 * @return the XML serialization of the given object as a string
 */
Sarissa.xmlize = function(anyObject, objectName, indentSpace){
    indentSpace = indentSpace?indentSpace:'';
    var s = indentSpace  + '<' + objectName + '>';
    var isLeaf = false;
    if(!(anyObject instanceof Object) || anyObject instanceof Number || anyObject instanceof String || anyObject instanceof Boolean || anyObject instanceof Date){
        s += Sarissa.escape(""+anyObject);
        isLeaf = true;
    }else{
        s += "\\n";
        var isArrayItem = anyObject instanceof Array;
        for(var name in anyObject){
            s += Sarissa.xmlize(anyObject[name], (isArrayItem?"array-item key=\""+name+"\"":name), indentSpace + "   ");
        }
        s += indentSpace;
    }
    return (s += (objectName.indexOf(' ')!=-1?"</array-item>\\n":"</" + objectName + ">\\n"));
};

/**
 * Escape the given string chacters that correspond to the five predefined XML entities
 * @memberOf Sarissa
 * @param sXml the string to escape
 */
Sarissa.escape = function(sXml){
    return sXml.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&apos;");
};

/**
 * Unescape the given string. This turns the occurences of the predefined XML
 * entities to become the characters they represent correspond to the five predefined XML entities
 * @memberOf Sarissa
 * @param sXml the string to unescape
 */
Sarissa.unescape = function(sXml){
    return sXml.replace(/&apos;/g,"'").replace(/&quot;/g,"\"").replace(/&gt;/g,">").replace(/&lt;/g,"<").replace(/&amp;/g,"&");
};

/** @private */
Sarissa.updateCursor = function(oTargetElement, sValue) {
    if(oTargetElement && oTargetElement.style && oTargetElement.style.cursor !== undefined ){
        oTargetElement.style.cursor = sValue;
    }
};

/**
 * Asynchronously update an element with response of a GET request on the given URL.  Passing a configured XSLT
 * processor will result in transforming and updating oNode before using it to update oTargetElement.
 * You can also pass a callback function to be executed when the update is finished. The function will be called as
 * <code>functionName(oNode, oTargetElement);</code>
 * @memberOf Sarissa
 * @param sFromUrl the URL to make the request to
 * @param oTargetElement the element to update
 * @param xsltproc (optional) the transformer to use on the returned
 *                  content before updating the target element with it
 * @param callback (optional) a Function object to execute once the update is finished successfuly, called as <code>callback(oNode, oTargetElement)</code>
 * @param skipCache (optional) whether to skip any cache
 */
Sarissa.updateContentFromURI = function(sFromUrl, oTargetElement, xsltproc, callback, skipCache) {
    try{
        Sarissa.updateCursor(oTargetElement, "wait");
        var xmlhttp = new XMLHttpRequest();
        xmlhttp.open("GET", sFromUrl, true);
        sarissa_dhtml_loadHandler = function() {
            if (xmlhttp.readyState == 4) {
                Sarissa.updateContentFromNode(xmlhttp.responseXML, oTargetElement, xsltproc, callback);
            }
        };
        xmlhttp.onreadystatechange = sarissa_dhtml_loadHandler;
        if (skipCache) {
             var oldage = "Sat, 1 Jan 2000 00:00:00 GMT";
             xmlhttp.setRequestHeader("If-Modified-Since", oldage);
        }
        xmlhttp.send("");
    }
    catch(e){
        Sarissa.updateCursor(oTargetElement, "auto");
        throw e;
    }
};

/**
 * Update an element's content with the given DOM node. Passing a configured XSLT
 * processor will result in transforming and updating oNode before using it to update oTargetElement.
 * You can also pass a callback function to be executed when the update is finished. The function will be called as
 * <code>functionName(oNode, oTargetElement);</code>
 * @memberOf Sarissa
 * @param oNode the URL to make the request to
 * @param oTargetElement the element to update
 * @param xsltproc (optional) the transformer to use on the given
 *                  DOM node before updating the target element with it
 * @param callback (optional) a Function object to execute once the update is finished successfuly, called as <code>callback(oNode, oTargetElement)</code>
 */
Sarissa.updateContentFromNode = function(oNode, oTargetElement, xsltproc, callback) {
    try {
        Sarissa.updateCursor(oTargetElement, "wait");
        Sarissa.clearChildNodes(oTargetElement);
        // check for parsing errors
        var ownerDoc = oNode.nodeType == Node.DOCUMENT_NODE?oNode:oNode.ownerDocument;
        if(ownerDoc.parseError && ownerDoc.parseError !== 0) {
            var pre = document.createElement("pre");
            pre.appendChild(document.createTextNode(Sarissa.getParseErrorText(ownerDoc)));
            oTargetElement.appendChild(pre);
        }
        else {
            // transform if appropriate
            if(xsltproc) {
                oNode = xsltproc.transformToDocument(oNode);
            }
            // be smart, maybe the user wants to display the source instead
            if(oTargetElement.tagName.toLowerCase() == "textarea" || oTargetElement.tagName.toLowerCase() == "input") {
                oTargetElement.value = new XMLSerializer().serializeToString(oNode);
            }
            else {
                // ok that was not smart; it was paranoid. Keep up the good work by trying to use DOM instead of innerHTML
                if(oNode.nodeType == Node.DOCUMENT_NODE || oNode.ownerDocument.documentElement == oNode) {
                    oTargetElement.innerHTML = new XMLSerializer().serializeToString(oNode);
                }
                else{
                    oTargetElement.appendChild(oTargetElement.ownerDocument.importNode(oNode, true));
                }
            }
        }
        if (callback) {
            callback(oNode, oTargetElement);
        }
    }
    catch(e) {
            throw e;
    }
    finally{
        Sarissa.updateCursor(oTargetElement, "auto");
    }
};


/**
 * Creates an HTTP URL query string from the given HTML form data
 * @memberOf Sarissa
 */
Sarissa.formToQueryString = function(oForm){
    var qs = "";
    for(var i = 0;i < oForm.elements.length;i++) {
        var oField = oForm.elements[i];
        var sFieldName = oField.getAttribute("name") ? oField.getAttribute("name") : oField.getAttribute("id");
        // ensure we got a proper name/id and that the field is not disabled
        if(sFieldName &&
            ((!oField.disabled) || oField.type == "hidden")) {
            switch(oField.type) {
                case "hidden":
                case "text":
                case "textarea":
                case "password":
                    qs += sFieldName + "=" + encodeURIComponent(oField.value) + "&";
                    break;
                case "select-one":
                    qs += sFieldName + "=" + encodeURIComponent(oField.options[oField.selectedIndex].value) + "&";
                    break;
                case "select-multiple":
                    for (var j = 0; j < oField.length; j++) {
                        var optElem = oField.options[j];
                        if (optElem.selected === true) {
                            qs += sFieldName + "[]" + "=" + encodeURIComponent(optElem.value) + "&";
                        }
                     }
                     break;
                case "checkbox":
                case "radio":
                    if(oField.checked) {
                        qs += sFieldName + "=" + encodeURIComponent(oField.value) + "&";
                    }
                    break;
            }
        }
    }
    // return after removing last '&'
    return qs.substr(0, qs.length - 1);
};


/**
 * Asynchronously update an element with response of an XMLHttpRequest-based emulation of a form submission. <p>The form <code>action</code> and
 * <code>method</code> attributess will be followed. Passing a configured XSLT processor will result in
 * transforming and updating the server response before using it to update the target element.
 * You can also pass a callback function to be executed when the update is finished. The function will be called as
 * <code>functionName(oNode, oTargetElement);</code></p>
 * <p>Here is an example of using this in a form element:</p>
 * <pre name="code" class="xml">&lt;form action="/my/form/handler" method="post"
 *     onbeforesubmit="return Sarissa.updateContentFromForm(this, document.getElementById('targetId'));"&gt;<pre>
 * <p>If JavaScript is supported, the form will not be submitted. Instead, Sarissa will
 * scan the form and make an appropriate AJAX request, also adding a parameter
 * to signal to the server that this is an AJAX call. The parameter is
 * constructed as <code>Sarissa.REMOTE_CALL_FLAG = "=true"</code> so you can change the name in your webpage
 * simply by assigning another value to Sarissa.REMOTE_CALL_FLAG. If JavaScript is not supported
 * the form will be submitted normally.
 * @memberOf Sarissa
 * @param oForm the form submition to emulate
 * @param oTargetElement the element to update
 * @param xsltproc (optional) the transformer to use on the returned
 *                  content before updating the target element with it
 * @param callback (optional) a Function object to execute once the update is finished successfuly, called as <code>callback(oNode, oTargetElement)</code>
 * @param skipCache (optional) whether to skip any cache
 */
Sarissa.updateContentFromForm = function(oForm, oTargetElement, xsltproc, callback) {
    try{
        Sarissa.updateCursor(oTargetElement, "wait");
        // build parameters from form fields
        var params = Sarissa.formToQueryString(oForm) + "&" + Sarissa.REMOTE_CALL_FLAG + "=true";
        var xmlhttp = new XMLHttpRequest();
        if(oForm.getAttribute("method") && oForm.getAttribute("method").toLowerCase() == "get") {
            xmlhttp.open("GET", oForm.getAttribute("action")+"?"+params, true);
        }
        else{
            xmlhttp.open('POST', oForm.getAttribute("action"), true);
            xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
            xmlhttp.setRequestHeader("Content-length", params.length);
            xmlhttp.setRequestHeader("Connection", "close");
        }
        sarissa_dhtml_loadHandler = function() {
            if (xmlhttp.readyState == 4) {
                Sarissa.updateContentFromNode(xmlhttp.responseXML, oTargetElement, xsltproc, callback);
            }
        };
        xmlhttp.onreadystatechange = sarissa_dhtml_loadHandler;
        xmlhttp.send("");
    }
    catch(e){
        Sarissa.updateCursor(oTargetElement, "auto");
        throw e;
    }
    return false;
};

//   EOF
/**
 * ====================================================================
 * About
 * ====================================================================
 * Sarissa cross browser XML library - IE XPath Emulation 
 * @version 0.9.9
 * @author: Copyright 2004-2007 Emmanouil Batsis, mailto: mbatsis at users full stop sourceforge full stop net
 *
 * This script emulates Internet Explorer's selectNodes and selectSingleNode
 * for Mozilla. Associating namespace prefixes with URIs for your XPath queries
 * is easy with IE's setProperty. 
 * USers may also map a namespace prefix to a default (unprefixed) namespace in the
 * source document with Sarissa.setXpathNamespaces
 *
 * ====================================================================
 * Licence
 * ====================================================================
 * Sarissa is free software distributed under the GNU GPL version 2 (see <a href="gpl.txt">gpl.txt</a>) or higher, 
 * GNU LGPL version 2.1 (see <a href="lgpl.txt">lgpl.txt</a>) or higher and Apache Software License 2.0 or higher 
 * (see <a href="asl.txt">asl.txt</a>). This means you can choose one of the three and use that if you like. If 
 * you make modifications under the ASL, i would appreciate it if you submitted those.
 * In case your copy of Sarissa does not include the license texts, you may find
 * them online in various formats at <a href="http://www.gnu.org">http://www.gnu.org</a> and 
 * <a href="http://www.apache.org">http://www.apache.org</a>.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY 
 * KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE 
 * WARRANTIES OF MERCHANTABILITY,FITNESS FOR A PARTICULAR PURPOSE 
 * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 
 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 
 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */
if(Sarissa._SARISSA_HAS_DOM_FEATURE && document.implementation.hasFeature("XPath", "3.0")){
    /**
    * <p>SarissaNodeList behaves as a NodeList but is only used as a result to <code>selectNodes</code>,
    * so it also has some properties IEs proprietery object features.</p>
    * @private
    * @constructor
    * @argument i the (initial) list size
    */
    SarissaNodeList = function (i){
        this.length = i;
    };
    /** <p>Set an Array as the prototype object</p> */
    SarissaNodeList.prototype = new Array(0);
    /** <p>Inherit the Array constructor </p> */
    SarissaNodeList.prototype.constructor = Array;
    /**
    * <p>Returns the node at the specified index or null if the given index
    * is greater than the list size or less than zero </p>
    * <p><b>Note</b> that in ECMAScript you can also use the square-bracket
    * array notation instead of calling <code>item</code>
    * @argument i the index of the member to return
    * @returns the member corresponding to the given index
    */
    SarissaNodeList.prototype.item = function(i) {
        return (i < 0 || i >= this.length)?null:this[i];
    };
    /**
    * <p>Emulate IE's expr property
    * (Here the SarissaNodeList object is given as the result of selectNodes).</p>
    * @returns the XPath expression passed to selectNodes that resulted in
    *          this SarissaNodeList
    */
    SarissaNodeList.prototype.expr = "";
    /** dummy, used to accept IE's stuff without throwing errors */
    if(window.XMLDocument && (!XMLDocument.prototype.setProperty)){
        XMLDocument.prototype.setProperty  = function(x,y){};
    };
    /**
    * <p>Programmatically control namespace URI/prefix mappings for XPath
    * queries.</p>
    * <p>This method comes especially handy when used to apply XPath queries
    * on XML documents with a default namespace, as there is no other way
    * of mapping that to a prefix.</p>
    * <p>Using no namespace prefix in DOM Level 3 XPath queries, implies you
    * are looking for elements in the null namespace. If you need to look
    * for nodes in the default namespace, you need to map a prefix to it
    * first like:</p>
    * <pre>Sarissa.setXpathNamespaces(oDoc, &quot;xmlns:myprefix=&amp;aposhttp://mynsURI&amp;apos&quot;);</pre>
    * <p><b>Note 1 </b>: Use this method only if the source document features
    * a default namespace (without a prefix), otherwise just use IE's setProperty
    * (moz will rezolve non-default namespaces by itself). You will need to map that
    * namespace to a prefix for queries to work.</p>
    * <p><b>Note 2 </b>: This method calls IE's setProperty method to set the
    * appropriate namespace-prefix mappings, so you dont have to do that.</p>
    * @param oDoc The target XMLDocument to set the namespace mappings for.
    * @param sNsSet A whilespace-seperated list of namespace declarations as
    *            those would appear in an XML document. E.g.:
    *            <code>&quot;xmlns:xhtml=&apos;http://www.w3.org/1999/xhtml&apos;
    * xmlns:&apos;http://www.w3.org/1999/XSL/Transform&apos;&quot;</code>
    * @throws An error if the format of the given namespace declarations is bad.
    */
    Sarissa.setXpathNamespaces = function(oDoc, sNsSet) {
        //oDoc._sarissa_setXpathNamespaces(sNsSet);
        oDoc._sarissa_useCustomResolver = true;
        var namespaces = sNsSet.indexOf(" ")>-1?sNsSet.split(" "):new Array(sNsSet);
        oDoc._sarissa_xpathNamespaces = new Array(namespaces.length);
        for(var i=0;i < namespaces.length;i++){
            var ns = namespaces[i];
            var colonPos = ns.indexOf(":");
            var assignPos = ns.indexOf("=");
            if(colonPos > 0 && assignPos > colonPos+1){
                var prefix = ns.substring(colonPos+1, assignPos);
                var uri = ns.substring(assignPos+2, ns.length-1);
                oDoc._sarissa_xpathNamespaces[prefix] = uri;
            }else{
                throw "Bad format on namespace declaration(s) given";
            };
        };
    };
    /**
    * @private Flag to control whether a custom namespace resolver should
    *          be used, set to true by Sarissa.setXpathNamespaces
    */
    XMLDocument.prototype._sarissa_useCustomResolver = false;
    /** @private */
    XMLDocument.prototype._sarissa_xpathNamespaces = new Array();
    /**
    * <p>Extends the XMLDocument to emulate IE's selectNodes.</p>
    * @argument sExpr the XPath expression to use
    * @argument contextNode this is for internal use only by the same
    *           method when called on Elements
    * @returns the result of the XPath search as a SarissaNodeList
    * @throws An error if no namespace URI is found for the given prefix.
    */
    XMLDocument.prototype.selectNodes = function(sExpr, contextNode, returnSingle){
        var nsDoc = this;
        var nsresolver = this._sarissa_useCustomResolver
        ? function(prefix){
            var s = nsDoc._sarissa_xpathNamespaces[prefix];
            if(s)return s;
            else throw "No namespace URI found for prefix: '" + prefix+"'";
            }
        : this.createNSResolver(this.documentElement);
        var result = null;
        if(!returnSingle){
            var oResult = this.evaluate(sExpr,
                (contextNode?contextNode:this),
                nsresolver,
                XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
            var nodeList = new SarissaNodeList(oResult.snapshotLength);
            nodeList.expr = sExpr;
            for(var i=0;i<nodeList.length;i++)
                nodeList[i] = oResult.snapshotItem(i);
            result = nodeList;
        }
        else {
            result = oResult = this.evaluate(sExpr,
                (contextNode?contextNode:this),
                nsresolver,
                XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
        };
        return result;      
    };
    /**
    * <p>Extends the Element to emulate IE's selectNodes</p>
    * @argument sExpr the XPath expression to use
    * @returns the result of the XPath search as an (Sarissa)NodeList
    * @throws An
    *             error if invoked on an HTML Element as this is only be
    *             available to XML Elements.
    */
    Element.prototype.selectNodes = function(sExpr){
        var doc = this.ownerDocument;
        if(doc.selectNodes)
            return doc.selectNodes(sExpr, this);
        else
            throw "Method selectNodes is only supported by XML Elements";
    };
    /**
    * <p>Extends the XMLDocument to emulate IE's selectSingleNode.</p>
    * @argument sExpr the XPath expression to use
    * @argument contextNode this is for internal use only by the same
    *           method when called on Elements
    * @returns the result of the XPath search as an (Sarissa)NodeList
    */
    XMLDocument.prototype.selectSingleNode = function(sExpr, contextNode){
        var ctx = contextNode?contextNode:null;
        return this.selectNodes(sExpr, ctx, true);
    };
    /**
    * <p>Extends the Element to emulate IE's selectSingleNode.</p>
    * @argument sExpr the XPath expression to use
    * @returns the result of the XPath search as an (Sarissa)NodeList
    * @throws An error if invoked on an HTML Element as this is only be
    *             available to XML Elements.
    */
    Element.prototype.selectSingleNode = function(sExpr){
        var doc = this.ownerDocument;
        if(doc.selectSingleNode)
            return doc.selectSingleNode(sExpr, this);
        else
            throw "Method selectNodes is only supported by XML Elements";
    };
    Sarissa.IS_ENABLED_SELECT_NODES = true;
};/*
 * Copyright (c) 2006 Jonathan Weiss <jw@innerewut.de>
 *
 * Permission to use, copy, modify, and distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */


/* tooltip-0.1.js - Small tooltip library on top of Prototype 
 * by Jonathan Weiss <jw@innerewut.de> distributed under the BSD license. 
 *
 * Unlike other libraries it does not declare its own tooltip 
 * div or window. It relies on an already existing div or element defined by you to display as 
 * the tooltip. This element will be placed (and shown) near the mouse pointer when a trigger-element is moused-over.
 * 
 *
 * Usage: 
 *   <script src="/javascripts/prototype.js" type="text/javascript"></script>
 *   <script src="/javascripts/tooltip.js" type="text/javascript"></script>
 *   <script type="text/javascript">
 *     var my_tooltip = new Tooltip('id_of_trigger_element', 'id_of_tooltip_to_show_element')
 *   </script>
 * 
 * Now whenever you trigger a mouseOver on the `trigger` element, the tooltip element will
 * be shown. On o mouseOut the tooltip disappears. 
 * 
 * Example:
 * 
 *   <script src="/javascripts/prototype.js" type="text/javascript"></script>
 *   <script src="/javascripts/scriptaculous.js" type="text/javascript"></script>
 *   <script src="/javascripts/tooltip.js" type="text/javascript"></script>
 *
 *   <div id='tooltip' style="display:none; margin: 5px; background-color: red;">
 *     Detail infos on product 1....<br />
 *   </div>
 *
 *   <div id='product_1'>
 *     This is product 1
 *   </div>
 *
 *   <script type="text/javascript">
 *     var my_tooltip = new Tooltip('product_1', 'tooltip')
 *   </script>
 *
 * You can use my_tooltip.destroy() to remove the event observers and thereby the tooltip.
 */

var Tooltip = Class.create();
Tooltip.prototype = {
  initialize: function(element, tool_tip) {
    var options = Object.extend({
      default_css: false,
      margin: "0px",
	  padding: "5px",
	  backgroundColor: "#d6d6fc",
	  delta_x: 5,
	  delta_y: 5,
      zindex: 1000
    }, arguments[1] || {});

    this.element      = $(element);
    this.tool_tip     = $(tool_tip);

    this.options      = options;

    // hide the tool-tip by default
    this.tool_tip.hide();

    this.eventMouseOver = this.showTooltip.bindAsEventListener(this);
    this.eventMouseOut   = this.hideTooltip.bindAsEventListener(this);

    this.registerEvents();
  },

  destroy: function() {
    Event.stopObserving(this.element, "mouseover", this.eventMouseOver);
    Event.stopObserving(this.element, "mouseout", this.eventMouseOut);
  },

  registerEvents: function() {
    Event.observe(this.element, "mouseover", this.eventMouseOver);
    Event.observe(this.element, "mouseout", this.eventMouseOut);
  },

  showTooltip: function(event){
	Event.stop(event);
	// get Mouse position
    var mouse_x = Event.pointerX(event);
	var mouse_y = Event.pointerY(event);
	
	
	// decide if wee need to switch sides for the tooltip
	var dimensions = Element.getDimensions( this.tool_tip );
	var element_width = dimensions.width;
	var element_height = dimensions.height;
	
	if ( (element_width + mouse_x) >= ( this.getWindowWidth() - this.options.delta_x) ){ // too big for X
		mouse_x = mouse_x - element_width;
		// apply delta to make sure that the mouse is not on the tool-tip
		mouse_x = mouse_x - this.options.delta_x;
	} else {
		mouse_x = mouse_x + this.options.delta_x;
	}
	
	if ( (element_height + mouse_y) >= ( this.getWindowHeight() - this.options.delta_y) ){ // too big for Y
		mouse_y = mouse_y - element_height;
	    // apply delta to make sure that the mouse is not on the tool-tip
		mouse_y = mouse_y - this.options.delta_y;
	} else {
		mouse_y = mouse_y + this.options.delta_y;
	} 
	
	// now set the right styles
	this.setStyles(mouse_x, mouse_y);
	
		
	// finally show the Tooltip
	//new Effect.Appear(this.tool_tip);
	new Element.show(this.tool_tip);

  },
  
  setStyles: function(x, y){
    // set the right styles to position the tool tip
	Element.setStyle(this.tool_tip, { position:'absolute',
	 								  top:y + "px",
	 								  left:x + "px",
									  zindex:this.options.zindex
	 								});
	
	// apply default theme if wanted
	if (this.options.default_css){
	  	Element.setStyle(this.tool_tip, { margin:this.options.margin,
		 								  padding:this.options.padding,
		                                  backgroundColor:this.options.backgroundColor,
										  zindex:this.options.zindex
		 								});	
	}	
  },

  hideTooltip: function(event){
	//new Effect.Fade(this.tool_tip);
	new Element.hide(this.tool_tip);
  },

  getWindowHeight: function(){
    var innerHeight;
	if (navigator.appVersion.indexOf('MSIE')>0) {
		innerHeight = document.body.clientHeight;
    } else {
		innerHeight = window.innerHeight;
    }
    return innerHeight;	
  },
 
  getWindowWidth: function(){
    var innerWidth;
	if (navigator.appVersion.indexOf('MSIE')>0) {
		innerWidth = document.body.clientWidth;
    } else {
		innerWidth = window.innerWidth;
    }
    return innerWidth;	
  }

}//This is a function that handles sending the user to the login/join form
//with the login box focused it also determines the returnURL so the user
//can get back to the page they were on before logging in.
function redirectToLogin()
{
	returnURLManager.determineReturnURL();
	var loginJoin=$('loginJoinForm');
	loginJoin.submit();
}

//This function is similar to the login in that it redirects the user to the 
//login/join form but it passes a special parameter to cause the join box to 
//be focused on.
function redirectToJoin()
{
	returnURLManager.determineReturnURL();
	var loginJoin=$('loginJoinForm');
	if(loginJoin.action.indexOf('?')>0)
		loginJoin.action+="&join=true";
	else
		loginJoin.action+="?join=true";
	loginJoin.submit();
}




var ar_prefix_save = ""

function ar_createNewRecipient(suffix, handler) {
	var ds_nickname = $('ds_nickname_qs'+suffix)
	var ds_age = $('ds_age_qs'+suffix)
	var ds_gender_F = $('ds_gender_female_qs'+suffix)
	var ds_gender_M = $('ds_gender_male_qs'+suffix)
	var ds_rs = $('dynamicPBSaveRelationshipSelect'+suffix)
	var ds_birthmonth = $('ds_birthmonth_qs'+suffix)
	var ds_birthday = $('ds_birthday_qs'+suffix)
	
    var validText = validateRecipientInfo(ds_nickname.value,
                                          (ds_gender_F.checked || ds_gender_M.checked), 
                                          ds_rs.selectedIndex, 
                                          ds_age.value,
                                          ds_birthmonth.selectedIndex,
                                          ds_birthday.selectedIndex
                                          );
                                          
    var month = ds_birthmonth.selectedIndex;
    var day = ds_birthday.selectedIndex;
    var age =  ds_age.value;

    if (!validText || !validateBirthDate( month, day, age) ){
      // err msg is displayed by the validating methods
      return;
    }

	var url = '/jsp/xml/addRecipientXML.jsp;jsessionid=' + jspSessionId + '?'
			+ 'nickname=' + ds_nickname.value + '&'
			+ 'gender=' + ((ds_gender_M.checked)?'M':'F') + '&'
			+ 'age=' + ds_age.value + '&'
			+ 'relationship=' + getSelectedValue(ds_rs) + '&'
			+ 'birthMonth=' + getSelectedValue(ds_birthmonth) + '&'
			+ 'birthDay=' + getSelectedValue(ds_birthday)
	
	var loading_div=$('bb_content_profiling_load'+suffix)
	if (loading_div) loading_div.style.display = 'block'
	importXML(url, handler)
	//SiteCatalyst-->
		LogAddRecipientProfile()
	//End SiteCatalyst -->
	 

}

function ar_createNewRecipientAddressPop(suffix, handler) {
	var ds_nickname = $('ds_nickname_qs'+suffix)
	var ds_age = $('ds_age_qs'+suffix)
	var ds_gender_F = $('ds_gender_female_qs'+suffix)
	var ds_gender_M = $('ds_gender_male_qs'+suffix)
	var ds_rs = $('dynamicPBSaveRelationshipSelect'+suffix)
	var ds_birthmonth = $('ds_birthmonth_qs'+suffix)
	var ds_birthday = $('ds_birthday_qs'+suffix)
	
    var validText = validateRecipientInfo(ds_nickname.value,
                                          (ds_gender_F.checked || ds_gender_M.checked), 
                                          ds_rs.selectedIndex, 
                                          ds_age.value,
                                          ds_birthmonth.selectedIndex,
                                          ds_birthday.selectedIndex
                                          );
                                          
    var month = ds_birthmonth.selectedIndex;
    var day = ds_birthday.selectedIndex;
    var age =  ds_age.value;

    if (!validText || !validateBirthDate( month, day, age) ){
      // err msg is displayed by the validating methods
      return;
    }

	var url = '/jsp/xml/addRecipientXML.jsp;jsessionid=' + jspSessionId + '?'
			+ 'nickname=' + ds_nickname.value + '&'
			+ 'gender=' + ((ds_gender_M.checked)?'M':'F') + '&'
			+ 'age=' + ds_age.value + '&'
			+ 'relationship=' + getSelectedValue(ds_rs) + '&'
			+ 'birthMonth=' + getSelectedValue(ds_birthmonth) + '&'
			+ 'birthDay=' + getSelectedValue(ds_birthday)

	var loading_div=$('bb_content_profiling_load'+suffix)
	if (loading_div) loading_div.style.display = 'block'
	
	importXML(url, handler)
	//createRecipient('');
	//SiteCatalyst-->
		LogAddRecipientProfile()
	//End SiteCatalyst -->

}

function createRecipient(xmlDoc) {

	var recip = xmlDoc.getElementsByTagName('recipient')[0];

	//	ar_createNewRecipient('', addRecipient);
	//document.getElementById('recipientId').value="4455";
	document.getElementById('recipientId').value=recip.attributes[0].nodeValue;
	addEdditAddressSubmit('');
}

		function deleteItem(skuId){
			document.deleteForm.removalCatalogRefId.value = skuId;
			document.deleteForm.removeOrderItem.value = "Update";
			document.deleteForm.removalOrder.value="directMerchant"
			document.deleteForm.submit();
		} //End of deleteItem function.

		function deleteItemCart(skuId){
			document.deleteFormCart.removalCatalogRefId.value = skuId;
			document.deleteFormCart.removeOrderItem.value = "Update";
			document.deleteFormCart.removalOrder.value="directMerchant"
			document.deleteFormCart.submit();
		} //End of deleteItemCart function.

		function setOrderUpdate(){
			document.cartform.setOrderUpdateHidden.value = "Update";
			document.cartform.submit();
		} //End of setOrderUpdate function.

		function applyRewards(){
			document.getElementById('rewards').value = "rewards";
			document.cartform.submit();
		} //End of applyRewards function.

		function deleteInternetMerchantItem(skuId){
			document.deleteIMForm.removalCatalogRefId.value = skuId;
			document.deleteIMForm.removeOrderItem.value = "Update";
			document.deleteIMForm.removalOrder.value="internetMerchant"
			document.deleteIMForm.submit();
		} //End of deleteInternetMerchantItem function.
/***********
  Phil Armstrong

  Fancy Product Viewer using SimplePopup.js

  provides one function:
    pv_showProductById(productId)




**********************/
var moreLikeUrl;
var moreLikeUrlBackup='/jsp/search/index.jsp?x=0&y=0&keyword=&category=';
var skuQuantity=1;
var possibleCheckoutSku;
var productDetailsXML;
var productDetailsXMLD;
var prod_id;
var prod_idD;
var prod_category_id;
var prod_price;
var prod_priceD;
var prod_merchant_type;
var productViewerListeners = new Array();
var smallImagesTypes = new Array();
var smallImagesTypesD = new Array();
var skuIds = new Array();

  function redirectToCheckout()
{
	returnURLManager.determineCheckoutReturnURL();
	$('checkoutForm').submit();
}

/*
This function is written so that other objects can be added as listeners of the
productViewer. This way for example when a product is added to the bag any objects
that care to know about that can have their update method run on them.  Ex. myBagQuickView
*/
function pv_runListenerUpdates()
{
  for(i=0;i<productViewerListeners.length;i++)
    productViewerListeners[i]();
}

function editSku(productId,skuId,quantity)
{
  skuQuantity=quantity;
  if(SimplePopup)
    SimplePopup.hide()
  var url = '/estore/browse/xml/productViewerXML.jsp' +
        '?productID=' + productId +'&skuId='+skuId+'&edit=true'
  importXML(url, showProductDetails)
}

function pv_showProductById(productId) {
  if(FancyPopup)
    FancyPopup.hide()
  // SiteCatalyst-->CART-596
  LogClickItem(productId);
// End SiteCatalyst -->
  var url = '/estore/browse/xml/productViewerXML.jsp' +
        '?productID=' + productId
  importXML(url, showProductDetails)

}

function pv_showBadProduct() {
  SimplePopup.hideNow()
  SimplePopup.setContents("<strong>The product you have requested is not available at this time.</strong><br />Please try again later...")
  SimplePopup.showNow()
}

function showProductDetails(xmlDoc)
{
  var name = getText(xmlDoc.getElementsByTagName('name')[0]).unescapeHTML().stripScripts().stripTags();
  if(name == 'Product Not Found') {
    pv_showBadProduct();
    return;
  }
  productDetailsXML=xmlDoc;
  var skuSwatches=new Array();
  var brand=getText(xmlDoc.getElementsByTagName('brand')[0]);
  var brandLogoUrl=getText(xmlDoc.getElementsByTagName('brandlogo')[0]);
  var productImageUrl=getText(xmlDoc.getElementsByTagName('productimage')[0]);
  var productImageFrontUrl=getText(xmlDoc.getElementsByTagName('productimagefront')[0]);
  var productImageBackUrl=getText(xmlDoc.getElementsByTagName('productimageback')[0]);
  var productImageZoomUrl=getText(xmlDoc.getElementsByTagName('productimagezoom')[0]);
  var shippingDtl = getText(xmlDoc.getElementsByTagName('shippingDtl')[0]);
  var returnInstruc = getText(xmlDoc.getElementsByTagName('returnInstruc')[0]);
  var shippingDtlD = getText(xmlDoc.getElementsByTagName('shippingDtlD')[0]);
  var returnInstrucD = getText(xmlDoc.getElementsByTagName('returnInstrucD')[0]);
  var IMMessage  = getText(xmlDoc.getElementsByTagName('IMMessage')[0]);
  var partnerId = getText(xmlDoc.getElementsByTagName('partnerId')[0]);
  shippingDtl = shippingDtl.length ==0 ? shippingDtlD: shippingDtl;
  returnInstruc = returnInstruc.length ==0 ? returnInstrucD: returnInstruc;
  var contents='';

  if (location.href.startsWith("https:")) {
      if (brandLogoUrl.startsWith("http:"))
          brandLogoUrl="https" + brandLogoUrl.substring(4);
      if (productImageUrl.startsWith("http:"))
          productImageUrl="https" + productImageUrl.substring(4);
      if (productImageFrontUrl.startsWith("http:"))
          productImageFrontUrl="https" + productImageFrontUrl.substring(4);
      if (productImageBackUrl.startsWith("http:"))
          productImageBackUrl="https" + productImageBackUrl.substring(4);
      if (productImageZoomUrl.startsWith("http:"))
          productImageZoomUrl="https" + productImageZoomUrl.substring(4);
  }

  smallImagesTypes[0] = 'frontImage:' + productImageFrontUrl;
  smallImagesTypes[1] = 'backImage:' + productImageBackUrl;
  smallImagesTypes[2] = 'zoomImage:' + productImageZoomUrl;

  skuSwatches = getSkuSwatches(xmlDoc);

  var description= getText(xmlDoc.getElementsByTagName('description')[0]);
  var productId=prod_id=getText(xmlDoc.getElementsByTagName('id')[0]);
  var skus=xmlDoc.getElementsByTagName('sku');
  var from=getText(xmlDoc.getElementsByTagName('from')[0]);
  var merchantType=getText(xmlDoc.getElementsByTagName('merchanttype')[0]);

  var submitForm=getText(xmlDoc.getElementsByTagName('submitform')[0]);

  var skuAttributes=new Array();
  var listprice=' Unavailable';
  var saleprice=' Unavailable';
  var percentoff=' Unavailable';
  var hasSkus=skus.length>0?true:false;
  var editSku=getText(xmlDoc.getElementsByTagName('edit')[0]);
  if(hasSkus)
  {
    skuAttributes=getSkuAttributes(xmlDoc);
    listprice=formatRange(checkRange(xmlDoc.getElementsByTagName('listprice'),2));
    saleprice=formatRange(checkRange(xmlDoc.getElementsByTagName('saleprice'),2));
    if((checkRange(xmlDoc.getElementsByTagName('percentoff'),0))[1]>=10)
    {
     percentoff=formatRange(checkRange(xmlDoc.getElementsByTagName('percentoff'),0));
    }
    if (editSku == 'true') {
    	possibleCheckoutSku = getText(xmlDoc.getElementsByTagName('setSku')[0]);
    } else {
    	possibleCheckoutSku=skus[0].getAttribute("id");
    }
  }
  var categoryId=getText(xmlDoc.getElementsByTagName('categoryid')[0]);
  
  prod_category_id = categoryId;
  prod_price = saleprice; 

  contents+='<table cellpadding="0" cellspacing="0" border="0" class="mbp_productDetailDM">';
  contents+='	<tr>';
  contents+='		<td class="mbp_productDetail_centerContent">';
  contents+='			<span id="productDetailProductId" style="display:none">' + productId + '</span>';
  contents+='			<span class="mbp_productDetail_header_text">product <strong>details</strong></span>';
  contents+='			<table cellpadding="0" cellspacing="0" border="0" class="mbp_productDetail_productFrame">';
  contents+='				<tr>';
  contents+='					<td style="vertical-align:middle" class="mbp_productDetailDM_previewImages">';
  contents+='       				<!-- SMALL PRODUCT IMAGES -->';


  /* ---Use this Area for preview Images when they become available--- */
  
  if ((productImageFrontUrl.indexOf('.jpg') != -1) || (productImageBackUrl.indexOf('.jpg') != -1) || (productImageZoomUrl.indexOf('.jpg') != -1))
  {
	   contents+='       				<table cellpadding="0" cellspacing="0" border="0">';
	   
	   if(productImageFrontUrl.indexOf('.jpg') != -1) 
	   {
	   		contents+='       					<tr>';
	   		contents+='       						<td>';
		   	contents+='             					<div id="frontImage">';
	   		contents+='      	       						<a href="javascript:borderClickedImage(\'frontImage\',\''+productImageFrontUrl+'\',\'\');">';
	   		contents+='      		       						<img src="'+productImageFrontUrl+'" class="mbp_productDetail_largeImage" />';
	   		contents+='      	       						</a>';
	   		contents+='             					</div>';
	   		contents+='           					</td>';
	   		contents+='            				</tr>';
	   		contents+='            				<tr>';
	   		contents+='              				<td class="mbp_productDetailDM_previewImages_spacer">&nbsp;</td>';
	   		contents+='            				</tr>';
	   }
	
	   if(productImageBackUrl.indexOf('.jpg') != -1)
	   {
	    	contents+='            				<tr>';
	   		contents+='              				<td>';
	   		contents+='              					<div id="backImage">';
	   		contents+='       	       						<a href="javascript:borderClickedImage(\'backImage\',\''+productImageBackUrl+'\',\'\');">';
	   		contents+='       		       						<img src="'+productImageBackUrl+'" class="mbp_productDetail_largeImage" />';
	   		contents+='       	       						</a>';
	   		contents+='              					</div>';
	   		contents+='            					</td>';
	   		contents+='            				</tr>';
	   		contents+='            				<tr>';
	   		contents+='              				<td class="mbp_productDetailDM_previewImages_spacer">&nbsp;</td>';
	   		contents+='            				</tr>';
	   }
	
	   if(productImageZoomUrl.indexOf('.jpg') != -1)
	   {
	   		contents+='            				<tr>';
	   		contents+='              				<td> ';
		   	contents+='              					<div id="zoomImage">';
		   	contents+='       	       						<a href="javascript:borderClickedImage(\'zoomImage\',\''+productImageZoomUrl+'\',\'\');">';
		   	contents+='       		       						<img src="'+productImageZoomUrl+'" class="mbp_productDetail_largeImage" />';
		   	contents+='       	       						</a>';
		   	contents+='             					</div>';
	   		contents+='            					</td>';
	   		contents+='            				</tr>';
	   }
  	   contents+='       				</table>';
  }

  contents+='						<!-- SMALL PRODUCT IMAGES -->';
  contents+='					</td>';
  contents+='   				<td>&nbsp;&nbsp;</td>';
  contents+='					<td>';
  contents+='     					<table cellpadding="0" cellspacing="0" border="0">';
  contents+='     						<tr>';
  contents+='       						<td class="mbp_productDetail_productImage">';
  contents+='       							<div id="largeProductDisplay">';
  contents+='       								<!-- LARGE PRODUCT IMAGE -->';
  contents+='       								<a href="javascript:doPopup(\''+productImageUrl+'\');"><img src="'+productImageUrl+'" class="mbp_productDetail_largeImage" /></a>';
  contents+='       								<!-- LARGE PRODUCT IMAGE -->';
  contents+='       							</div>';
  contents+='       						</td>';
  contents+='     						</tr>';
  contents+='   					</table>';
  contents+='					</td>';
  contents+='					<td class="mbp_productDetail_spacerThin"></td>';
  contents+='					 <td class="mbp_productDetail_vertBar"></td>';
  contents+='					<td class="mbp_productDetail_spacerThin"></td>';
  contents+='					<td class="mbp_productDetail_itemDetails">';
  			  		
  contents+='  					<table style="text-align:left;" cellpadding="0" cellspacing="0" border="0">';
  contents+='							<tr>';
  contents+='       						<td colspan="7" class="mbp_productDetail_itemLogo">';
  contents+='       							<!-- BRAND LOGO -->';
  if(brandLogoUrl!='')
  {
     contents+='       								<img src="'+brandLogoUrl+'" />';
  }
  contents+='       							<!-- BRAND LOGO -->';
  contents+='     		       				</td>';
  contents+='       					</tr>';
  contents+='     						<tr>';
  contents+='    							<td colspan="7" class="mbp_productDetail_brandName">';
  contents+='       							<!-- BRAND NAME -->';
  contents+=brand;
  contents+='       							<!-- BRAND NAME -->';
  contents+='     							</td>';
  contents+='     						</tr>';
  contents+='     						<tr>';
  contents+='     							<td colspan="7" class="mbp_productDetail_itemName">';
  contents+='       							<!-- ITEM NAME -->';
  contents+=name;
  contents+='       							<!-- ITEM NAME -->';
  contents+='     							</td>';
  contents+='     						</tr>';
  if (from != "" && partnerId !="personalshopper") {

  } else {  
	  contents+='     						<tr>';
	  contents+='     							<td colspan="7" class="mbp_productDetail_merchantName">';
	  contents+='       							<!-- MERCHANT NAME -->';
	  contents+='       							from '+from;
	  contents+='       							<!-- MERCHANT NAME -->';
	  contents+='     							</td>';
	  contents+='     						</tr>';
  }
  contents+='     						<tr><td colspan="7">&nbsp;</td></tr>';
  contents+='     						<tr>';
  contents+='     							<td colspan="7" valign="center" class="mbp_productDetail_itemDesc">';
  contents+='     								<div id="mbp_productDetail_productDescription" class="mbp_productDetail_productDescription">';
  contents+='       								<!-- DESCRIPTION --> ';
  contents+=sanitizeHTML(description.unescapeHTML());
  contents+='       								<!-- DESCRIPTION -->';
  contents+='									</div>';
  contents+='								</td>';
  contents+='      					</tr>';
  contents+='      					<tr>';
  contents+='     				  			<td colspan="7">';
  contents+='     								<span class="mbp_productDetail_itemNumber"><br>';
  contents+='     				  					<!-- ITEM NUMBER -->';
  contents+='     				  					item #: ';
  contents+=productId;
  contents+='       								<!-- ITEM NUMBER -->';
  contents+='     								</span>';
  contents+='     							</td>';
  contents+='     						</tr>';
  contents+='      					<tr>';
  contents+='       						<td colspan="7">&nbsp;&nbsp;</td>';
  contents+='     						</tr>';
  contents+='     						<tr>';
  contents+='       						<td colspan="7" class="mbp_productDetailDM_horizRule"></td>';
  contents+='     						</tr>';
  contents+='     						<tr>';

  if(percentoff!=' Unavailable')
  {
  	 contents+='       						<td colspan="6">';
  	 contents+='     							<table width="300px" cellpadding="0" cellspacing="0" border="0">';
  	 contents+='     								<tr>';
  	 contents+='     									<td class="mbp_productDetail_price">';
  	 contents+='     										$<span id="saleprice">'+saleprice+'</span>&nbsp;&nbsp;';
  	 contents+='     									</td><td>&nbsp;</td>';
     contents+='     									<td class="mbp_productDetailDM_percentageSaved">';
     contents+='				       						<!-- PERCENTAGE SAVED -->';
     contents+='											<span id="percentoff">'+percentoff+'%</span>';
     contents+='				       						<span class="mbp_productDetailDM_percentageSavedText"> off</span>';
     contents+='       										<!-- PERCENTAGE SAVED -->';
     contents+='				     					</td><td>&nbsp;</td>';
     contents+='     									<td class="mbp_productDetailDM_originalPrice">was ';
     contents+='				       						<!-- ORIGINAL PRICE -->';
     contents+='											<span id="listprice">$'+listprice+'</span>';
     contents+='				       						<!-- ORIGINAL PRICE -->';
     contents+='     									</td>';
     contents+='				     				</tr>';
  	 contents+='     							</table>';
  	 contents+='				     		</td>';
  }
  else
  {
    contents+='     						<td colspan="6" class="mbp_productDetail_price">';
  	 contents+='     							$<span id="saleprice">'+saleprice+'</span>&nbsp;&nbsp;';
  	 contents+='     						</td>';
  }
  
  contents+='     							<td class="mbp_productDetailDM_tinySpacer"></td>';
  contents+='     						</tr>';


  var logEventName = '';
  var logEventDesc = '';
  if(merchantType=="directMerchant")
  {	
	 prod_merchant_type = "DM";
    logEventName = 'event39';
    logEventDesc = 'Save DM Product for Later';
    contents+='     						<tr>';
    contents+='       							<td colspan="7" class="mbp_productDetailDM_horizRule"></td>';
    contents+='     						</tr>';
    contents+='     						<tr>';
    contents+='       							<td colspan="7" class="mbp_productDetailDM_selectionSection">';
    contents+='      								<table cellpadding="3" cellspacing="3" border="0">';
    contents+='        								<tr>';
    contents+='         				 					<td class="mbp_productDetailDM_selectionHeaderText">make a selection:&nbsp;</td>';
    contents+='        								</tr>';
    contents+='        								<tr>';
    contents+='        									<td colspan="2">';
    contents+='       											<form id="skuAttributeForm">';
    contents+='       												<table cellpadding="0" cellspacing="0" border="0">';
    for(z=0;z<skuAttributes.length;z++)
    {
  	   	var skuIds = getSkuIds(xmlDoc);
      	var attributeOptions=getOptionsArray($A(xmlDoc.getElementsByTagName("skuAttribute"+skuAttributes[z])));
      	contents+='       													<tr>';
      	contents+='         													<td class="mbp_productDetailDM_selectionText">';
      	contents+='         														<label class="mbp_productDetailDM_sizeSelect">' + skuAttributes[z] + ':&nbsp;</label>';
      	contents+='         													</td>';
      	contents+='         													<td class="mbp_productDetailDM_selectionTd">';
      	contents+='           														<select onchange="updateDropdowns(this,\''+productId+'\');changeImages(this);" name="'+skuAttributes[z]+'" size="1" id="skuSelector'+skuAttributes[z]+'" class="mbp_productDetailDM_Select">';
      	contents+='																		<option value="choose">choose</option>';
       for(j=0;j<attributeOptions.length;j++)
  		{
			contents+='																		<option value="'+attributeOptions[j]+'" >' + attributeOptions[j] + '</option>';
       }
      	contents+='																	</select>';
      	contents+='        														</td>';
     	contents+='       													</tr>';
    }
    contents+='       												</table>';
    contents+='       											</form>';
    contents+='      										</td>';
    contents+='      									</tr>';
    contents+='      									<tr>';
    contents+='         									<td class="mbp_productDetailDM_selectionText">';
    contents+='         										<label for="mbp_productDetailDM_quantitySelect">quantity:&nbsp;</label>';
    contents+='         									</td>';
    contents+='         									<td class="mbp_productDetailDM_selectionTd">';
    contents+='           										<input type="text" size="4" maxlength="2" id="mbp_productDetailDM_quantitySelect" class="mbp_productDetailDM_quantitySelect" value="' + skuQuantity + '"/>';
    contents+='         									</td>';
    contents+='       									</tr>';
    contents+='       								</table>';
    contents+='    							</td>';
    contents+='     						</tr>';
  }
  else
  {
    prod_merchant_type = "IM";
    logEventName = 'event38';
    logEventDesc = 'Save IM Product for Later';
    contents+='     						<tr>';
    contents+='								<td colspan="7">';
    contents+='									<form id="skuAttributeForm"><input id="mbp_productDetailDM_quantitySelect" type="hidden" value="1"></form>';
    contents+='								</td>';
    contents+='							</tr>';
  }

  contents+='						</table>';
  contents+='   				</td>';
  contents+='  			</tr>';

	/*  ----Use This Area for product color swatches when they become available----- */
	/*  ----Use an entire row for Swatches... up to 10 per row---- */

  	for(k=0;k<skuSwatches.length;k++)
  	{
  		if(k = 0) {
  			contents+='  			<tr>';
  			contents+='					<td align="left">';
		   	contents+='						<table cellpadding="3" cellspacing="3" border="0" class="mbp_productDetailDM_swatches">';
  			contents+='							<tr>';
  		} else if(k % 10 ==0 & k > 0) {
			contents+='							</tr>';
		   	contents+='							<tr>';
	   	}
		var skuId =  skuSwatches[k].substring(0, skuSwatches[k].indexOf('_'));
		skuId = skuId.replace(/^\s+|\s+$/g,"");
	   	contents+='								<td>';
	   	contents+='									<div id="'+skuId+'">';
	   	var skuPath = skuSwatches[k].substring(skuSwatches[k]);
	    if (location.href.startsWith("https:")) {
	    	skuPath = skuPath.replace("http:", "https:")
	    }	   		   	
	   	contents+='										<a href="javascript:changeSkuColor(\''+skuPath+'\')">';
	   	contents+='											<img src="'+ skuPath.substring(skuPath.indexOf(';')+1) +'" class="mbp_productDetailDM_smallImageOn" />';
	   	contents+='										</a>';
	   	contents+='									</div>';
      	contents+='								</td>';
  	}
	if(k > 0) 
	{
		contents+='							</tr>';
		contents+='						</table>';
      	contents+='					</td>';
      	contents+='				</tr>';
	}

  	contents+='			</table>';
  	contents+='  </td>';
  	contents+='  </tr>';
  	
  	contents+='  <tr>';
	contents+='		<td colspan="1" align="right">';
	contents+='   		<table cellpadding="0" cellspacing="0" border="0">';
	contents+='     		<tr>';

    var staticServerName = staticServer;
    if (location.href.startsWith("https:") && staticServerName.startsWith("http:")) {
        staticServerName = "https" + staticServerName.substring(4);
    }
    
	if(editSku != 'true')
	{
	   
		contents+=' <td valign="middle" width="75%"> ';
		contents+=' </td>'
	   	
	   	
		contents+='     			<td class="mbp_productDetail_btnSpacer"></td>';
        contents+='     			<td>';
        contents+='       				<!-- SAVE ITEM BUTTON -->';
        contents+='       				<div id="offerToSaveDiv"></div>';
        contents+='       				<a id="popupSaveButton" href="javascript:LogCartEvent(\''+ logEventName+'\',\''+logEventDesc+'\',\'' + prod_merchant_type + '\');ProductSaver.offerToSave(\'offerToSaveDiv\',\'' + productId + '\',\'' + saleprice + '\',\''+productImageUrl+'\',\'' + addslashes(brand.unescapeHTML()) + '\'); ">'
        contents+='       					<img src="'+staticServerName+'/images/popup/productViewer/'+partnerId+'/save.jpg" class="mbp_productDetail_saveBtn" />';
        contents+='       				</a>';
        contents+='       				<!-- SAVE ITEM BUTTON -->';
        contents+='     			</td>';
        contents+='     			<td >&nbsp;</td>';
        contents+='     			<td>';
    
        if(hasSkus) {
            //<!-- ADD ITEM TO BAG BUTTON -->
            contents+='     				<a id="addToMyBagButton" href="#" onclick="return checkInputsAndSubmit(this); ">'
            contents+='       					<img src="'+staticServerName+'/images/popup/productViewer/'+partnerId+'/add-to-bag.jpg" class="mbp_productDetail_add2BagBtn" />'
            contents+='      				</a>'
            contents+='       				<div id="popup_'+ productId +'" style="position:absolute;z-index:1000;left:-215px;top:170px;"></div>'
            //<!-- ADD ITEM TO BAG BUTTON -->
        }
        else  {
            contents+='       				<img src="/estore/images/popup/temp-unavail.gif" />';
        }
        contents+='     			</td>';
  	}
  	else
  	{
        contents+='     			<td colspan="2">';
        contents+='     				<a id="addToMyBagButton" href="#" onclick="return checkInputsAndSubmit(this,true); ">';
        contents+='     					<img src="'+staticServerName+'/images/popup/productViewer/'+partnerId+'/save-changes.jpg"  />';
        contents+='     				</a>';
        contents+='     			</td>';
  	}

  	contents+='     		</tr>';	
  	contents+='             <tr>';
  	contents+='     			<td colspan="7" valign="middle" width="100%" align="right">';
   	contents+='      				<a href="#" class="mbp_productDetail_footer_link"  onclick="FancyPopup.hide();return false;">';
   	contents+='      					continue shopping</a>';
   	contents+='      				<span class="mbp_productDetail_footer_text">';
   	contents+='      					&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>';
   	contents+='      			</td>';

	contents+=' 		 	</tr>';
	contents+='   		</table>';
  
  	contents+='  	</td>';
  	contents+='  </tr>';
  	
  	contents+='  <tr>';
  	contents+='  	<td>';
	if(merchantType=="directMerchant") {
		contents+='<div class="pdp_r2">';
		contents+='	<ul id="pdp_menu">';
        contents+='      <li id="pdp_nav-1"><div><b class="b1"></b><b class="b2"></b><b class="b3"></b><b class="b4"></b><a onclick="prodmsg(';
        contents+="'shippingDtl'";
        contents+=');" id="pdp_nav-1a" class="active">When will this Ship?</a></div></li>';
        contents+='      <li id="pdp_nav-2"><div><b class="b1"></b><b class="b2"></b><b class="b3"></b><b class="b4"></b><a onclick="prodmsg(';
        contents+="'returnInstruc'";
        contents+=');" id="pdp_nav-2a" class="inactive">Return Policy</a></div></li>';
        contents+='     </ul>';
        contents+='     <div class="pdp_det_copy_cont">';
        contents+='      <div id="shippingDtl" class="pdp_det_copy">'+shippingDtl+'</div>';
        contents+='      <div id="returnInstruc" class="pdp_det_copy" style="display:none;">'+returnInstruc+'</div>';
        contents+='     </div>';
        contents+='    </div>';
    }
    else{
        contents+='     <div class="pdp_det_copy_cont pdp_det_copy_cont2">';
        contents+='      <div id="IMMessage" class="pdp_det_copy">'+IMMessage+'</div>';
       contents+='     </div>';
    
    } 
  	
  	contents+='  	</td>';
  	contents+='  </tr>';
	   
  	
	contents+='</table>';
  	contents+=submitForm;
  FancyPopup.hide();
  FancyPopup.setContents(contents);
  FancyPopup.show();
  processPreselects(xmlDoc);

}

function refreshLargeImage(url) {
	if(url.lastIndexOf('_') > -1)
  {
    url=url.substring(0,url.lastIndexOf('_'));
    url+="_213x326.jpg";
   }
   content = '<a href="javascript:doPopup(\''+url+'\');"><img src="'+url+'" class="mbp_productDetailDM_largeImage" /></a>';
   document.getElementById('largeProductDisplay').innerHTML = content;
}

function doPopup(url)
{

  if(url.lastIndexOf('_') > -1)
  {
    url=url.substring(0,url.lastIndexOf('_'));
    url+="_600x920.jpg";
   }
  popup(url, "LargeImage", 650, 700);
}


//this function will take a collection of html elements and get the text out of them and determine the highest and lowest values in the elements
function checkRange(elms,precision)
{
  var retVal=highVal=lowVal= parseFloat(getText(elms[0]));
  for(i=1;i<elms.length;i++)
  {
     var temp= parseFloat(getText(elms[i]));
     if(temp>highVal)
        highVal=temp;
     else
        lowVal=temp;
  }
  retVal=new Array(lowVal.toFixed(precision),highVal.toFixed(precision));
  return retVal;
}
//this function takes an array of two elements and converts the elements into the from "first element"-"second element" or just "first element" if both are equal
function formatRange(range)
{
  if(range[0]!=range[1])
    return range[0]+'-'+range[1];
  else
    return range[0];
}


function processPreselects(xmlDoc)
{
  var selectValues=xmlDoc.getElementsByTagName('currentSelection');
  for(i=0;i<selectValues.length;i++)
  {
      var select=document.getElementById('skuSelector'+selectValues[i].getAttribute('select'));
      var options =select.getElementsByTagName('option');
      for(j=0;j<options.length;j++)
      {
        if(options[j].value==getText(selectValues[i]))
        {
          select.selectedIndex=j;
        }
      }
  }
  updateDropdowns();
}

//gets the options for a particular attribute select dropdown
function getOptionsArray(options)
{
  options=$A(options);
  var retVal = new Array();
  var opValue;
  options=sortOptions(options);
  for(i=0;i<options.length;i++)
  {
	opValue = getText(options[i]);
	if(opValue != '')
		opValue = opValue.replace(/^\s+|\s+$/g,"");

   if(opValue.length > 0 && retVal.indexOf(opValue)<0) {

       retVal.push(opValue);
   }
  }
  return retVal;
}

function sortOptions(options)
{
   return options.sort(sortBySortOrderOrDefault)
}

//This is a compare function for the skuAttribute sorting.  If there is a sort order defined for the elements
//it will use that order.  Otherwise it will default to
function sortBySortOrderOrDefault(optionA,optionB)
{
  optionAOrder = parseInt(optionA.getAttribute('sortOrder'));
  optionBOrder = parseInt(optionB.getAttribute('sortOrder'));
  if(isNaN(optionAOrder) && isNaN(optionBOrder))
  {
    var opAText=getText(optionA);
    var opBText=getText(optionB);

    if(opAText.match(/\D/) || opBText.match(/\D/) || opAText=='' || opBText=='')
    {
      if(opAText < opBText)
        return -1
      else
    {
        return 1
    }
    }
    else
      return parseInt(opAText)-parseInt(opBText)
  }
  else if(isNaN(optionAOrder))
    return 1
  else if(isNaN(optionBOrder))
    return -1
  return optionAOrder - optionBOrder
}

function getSkuAttributes(xmlDoc)
{
  var attributes=new Array();
  var tags=xmlDoc.getElementsByTagName("attributeName")
  for(i=0;i<tags.length;i++)
    attributes[i]=getText(tags[i]);
  return attributes;
}


function getSkuSwatches(xmlDoc)
{
  var attributes=new Array();
  var tags=xmlDoc.getElementsByTagName("skuSwatch")
  for(i=0;i<tags.length;i++)
    attributes[i]=getText(tags[i]);
  return attributes;
}


function changeSkuColor(val)
{
	var skuId = val.substring(0, val.indexOf('_'));
	skuId = skuId.replace(/^\s+|\s+$/g,"");
	var selVal = val.substring(val.indexOf('_')+1, val.indexOf(';'));
	var url = val.substring(val.indexOf(';')+1);

	var selectobject=document.getElementById("skuSelectorcolor")
	for (var i=0; i<selectobject.length; i++){
		if(selVal == selectobject.options[i].value) {
			selectobject.options[i].selected = val;
			updateDropdowns(selectobject.options[i]);
			break;
		}
	}
	borderSkuSwatchImages(skuId);
	changeAllImagesColor(skuId);

}

function borderSkuSwatchImages(skuId) {
	var skuSwatches = getSkuSwatches(productDetailsXML);
	var sId;
	for(i=0;i<skuSwatches.length;i++) {
		sId = skuSwatches[i].substring(0,skuSwatches[i].indexOf('_'));
		sId = sId.replace(/^\s+|\s+$/g,"");
		if(skuId == sId) {
			document.getElementById(sId).innerHTML = ' <a href="javascript:changeSkuColor(\''+skuSwatches[i]+'\')"><img src="'+ skuSwatches[i].substring(skuSwatches[i].indexOf(';')+1) +'" class="mbp_productDetailDM_largeImageOn" /></a>';
		}else {
			document.getElementById(sId).innerHTML = ' <a href="javascript:changeSkuColor(\''+skuSwatches[i]+'\')"><img src="'+ skuSwatches[i].substring(skuSwatches[i].indexOf(';')+1) +'" class="mbp_productDetailDM_smallImageOn" /></a>';
		}
	}
}

function changeAllImagesColor(skuId) {
	var largeProductContent = document.getElementById('largeProductDisplay').innerHTML;

	largeProductContent = largeProductContent.substring(largeProductContent.indexOf('src=')+5);

	largeProductContent = largeProductContent.substring(0,largeProductContent.indexOf('>')-1);

	url1 = largeProductContent.substring(0,largeProductContent.lastIndexOf('/'));
	url2 = url1.substring(0,url1.lastIndexOf('/')+1);
	url3 = largeProductContent.substring(largeProductContent.lastIndexOf('/'));
	largeProductContent = url2 + skuId + url3;

	//Replace the skuId with the productId so ImageCacher will pickup image. www-6660
	largeProductContent = largeProductContent.replace(skuId, prod_id); 

	borderClickedImage('', largeProductContent, skuId);
}

function updateDropdowns(sel)
{
  var selects=document.getElementById("skuAttributeForm").getElementsByTagName("select")
  var skuList=productDetailsXML.getElementsByTagName("sku")
  var skuIds=new Array();
  var tempNode=null;
  var selectOptNum = -1;
  for(j=0;j<skuList.length;j++)
  {
    skuIds[j]=skuList[j].getAttribute("id");
  }
  for(i=0;i<selects.length;i++)
  {
    var curSelect=selects[i];
    if(curSelect.options[curSelect.selectedIndex].value != "choose")
    {
      var attributeValues=productDetailsXML.getElementsByTagName("skuAttribute"+curSelect.name)
      for(k=0;k<attributeValues.length;k++)
      {
        if(getText(attributeValues[k]).unescapeHTML()!=curSelect.options[curSelect.selectedIndex].value) {
        	//Determine which SELECT box the user is selecting, and modify all the others.
			if(curSelect.name == sel.name) {
        		selectOptNum = i;
        	}
            skuIds=skuIds.without((attributeValues[k].parentNode).getAttribute("id"))
        }
        else {
            tempNode=attributeValues[k].parentNode;
			for(p=0;p<skuList.length;p++)
			  {
				if(skuIds[0] == skuList[p].getAttribute("id")) {
					tempNode=skuList[p];
					break;
				}

			  }
		}
      }
    }
  }
  if(skuIds.length==1 && tempNode)
    checkPrice(skuIds[0],tempNode);

  var selectContent;
  var selectArray;

  for(p=0;p<selects.length;p++)
  {

    var preVal=selects[p].options[selects[p].selectedIndex].value
    selectArray=new Array();
	if (p != selectOptNum) {
		selects[p].innerHTML='';
	}
    //***START**Enhancements for the select options****Display Choose option only when we have more than one option*************
	var attValues=getOptionsArray(productDetailsXML.getElementsByTagName("skuAttribute"+selects[p].name))

	if(attValues.length > 1) {
		//Only modify the SELECT boxes that were not selected.
		if( p != selectOptNum) {
			var option=document.createElement("OPTION");
			option.text="choose";
			option.value="choose";
			selects[p].options[0]=new Option("choose","choose");
			for(h=0;h<skuList.length;h++){
				if(skuIds.contains(skuList[h].getAttribute("id"))) {
					selectArray.append(skuList[h].getElementsByTagName("skuAttribute"+selects[p].name)[0]);
				}
			}
			selectArray = getOptionsArray(selectArray);
			for(m=0; m<selectArray.length;m++){
				selects[p].options[m+1]=new Option(selectArray[m],selectArray[m]);
			}
		}
		selects[p].value=preVal;
	}
  else {

		for(h=0;h<skuList.length;h++)
		{
		   if(skuIds.contains(skuList[h].getAttribute("id")))
		      selectArray.append(skuList[h].getElementsByTagName("skuAttribute"+selects[p].name)[0])
		}
		selectArray = getOptionsArray(selectArray)
		for(m=0; m<selectArray.length;m++)
		{
		    selects[p].options[m]=new Option(selectArray[m],selectArray[m])
	}
		selects[p].value=selectArray;
	}
  }
}

function checkPrice(skuId,Node)
{
  possibleCheckoutSku=skuId;
  var listprice=parseFloat(getText(Node.getElementsByTagName('listprice')[0]))
  var saleprice=parseFloat(getText(Node.getElementsByTagName('saleprice')[0]))
  var percentoff=(100*(1-(saleprice/listprice))).toFixed(0);
  document.getElementById('saleprice').innerHTML=saleprice.toFixed(2)
  if(saleprice<listprice)
  {
  document.getElementById('listprice').innerHTML= '$' + listprice.toFixed(2)
  document.getElementById('percentoff').innerHTML=percentoff + '%'
  }
}

function checkInputsAndSubmit(submitButton, isEdit)
{

  var errorArray=new Array();
  var quantity=-1;
  if (prod_merchant_type == "DM") {
  quantity=document.getElementById('mbp_productDetailDM_quantitySelect').value
  } else {
  quantity=1
  }
  if( quantity<1)
    errorArray[0]="Quantity"
  var selects=document.getElementById('skuAttributeForm').getElementsByTagName('select')
  for(i=0;i<selects.length;i++)
  {
    if(selects[i].options[selects[i].selectedIndex].value=="choose")
      errorArray.append(selects[i].name)
  }
  if(errorArray.length>0)
     alert("Please check the following fields:" +errorArray);
  else
  {

    document.getElementById('productQuantity').value=quantity
    document.getElementById('productSkuId').value=possibleCheckoutSku
    document.getElementById('productProductId').value=prod_id
    document.getElementById('addToOrderHidden').value = "Add"

    var adjustQuantity = quantity;
    if(isEdit)
    {
      adjustQuantity = quantity - skuQuantity;  //this is to update omniture correctly
      if(adjustQuantity > 0)
        scAdd(prod_id,prod_price,adjustQuantity,prod_merchant_type);
      else
        scRemove(prod_id, prod_price, adjustQuantity*-1, prod_merchant_type)

      document.getElementById('addToCart').submit()
    }
    else
    {
      scAdd(prod_id,prod_price,quantity,prod_merchant_type);
      submitAction();
    }
  }

  return false;
}

function submitAction()
{
          var addForm=$('addToCart')
          if(addForm != null)
          {
            addForm.action='/estore/browse/xml/addItemSuccessXML.jsp'

           addForm.request({
              onComplete: checkAddToBagResponse
            })
          }
}

function checkAddToBagResponse(xmlResponse)
{
  try
  {
    var xmlDoc=xmlResponse.responseXML
    var message=xmlDoc.getElementsByTagName("message")[0]
    var error=message.getAttribute("error")
    if(error=='true')
      alert("There was a problem adding this item to your bag")
  }
  catch (e)
  {}
  finally
  {
    FancyPopup.hide();
    pv_runListenerUpdates();
  }
}


//This function will take out any script or anchor tags from a string
//Designed especially for product descriptions for merchants that included links to non-existent javascript
function sanitizeHTML(str)
{

  str=str.replace( /<a.*?>/gi,"");
  str=str.replace( /<\/a.*?>/gi,"");
  str=str.replace( /<script.*?>.*?<\/script>/gi,"");

  return str
}

function borderClickedImage(imageType, url, skuId) {
	var iType, imageURL, url1, url2, url3;

	for(i=0;i<smallImagesTypes.length; i++) {
		iType = smallImagesTypes[i].substring(0,smallImagesTypes[i].indexOf(':'));

		imageURL = smallImagesTypes[i].substring(smallImagesTypes[i].indexOf(':')+1);
		imageURL = imageURL.replace(/^\s+|\s+$/g,"");

		if(skuId != null && skuId != '') {
			url1 = imageURL.substring(0,imageURL.lastIndexOf('/'));
			url2 = url1.substring(0,url1.lastIndexOf('/')+1);
			url3 = imageURL.substring(imageURL.lastIndexOf('/'));
			imageURL = url2 + skuId + url3;
			smallImagesTypes[i] = iType + ":" +imageURL;
		}
		if (document.getElementById(iType) == null)
            continue;

		if(iType == imageType) {
			document.getElementById(iType).innerHTML = '<a href="javascript:borderClickedImage(\''+iType+'\',\''+imageURL+'\',\'\'); "><img src="'+imageURL+'" class="mbp_productDetailDM_largeImageOn" /></a>';
		} else {
			document.getElementById(iType).innerHTML = '<a href="javascript:borderClickedImage(\''+iType+'\',\''+imageURL+'\',\'\'); "><img src="'+imageURL+'" class="mbp_productDetail_largeImage" /></a>';
		}
	}
	refreshLargeImage(url);

}

function getSkuIds(xmlDoc)
{
  var retVal=new Array();
  var tempArr = new Array();
  var tags=xmlDoc.getElementsByTagName("sku")

  for(i=0;i<tags.length;i++)
  {
   if(tempArr.indexOf(getText(tags[i].getElementsByTagName("skuAttributecolor")[0]))<0)
       retVal.push(getText(tags[i].getElementsByTagName("skuAttributecolor")[0]) + ':' + tags[i].getAttribute('id'));
	tempArr.push(getText(tags[i].getElementsByTagName("skuAttributecolor")[0]));
  }
  tempArr = null;
  return retVal;
}

function changeImages(val) {
	var selColor = val.value;
	var color, skuId;
	skuIds = getSkuIds(productDetailsXML);
	for(i=0; i<skuIds.length; i++) {
		color = skuIds[i].substring(0, skuIds[i].indexOf(':'));
		skuId = skuIds[i].substring(skuIds[i].indexOf(':')+1);

		if(selColor == color ){
			changeAllImagesColor(skuId);
			borderSkuSwatchImages(skuId);
			break;
		}
	}
}

//*********************************************
//*** Functions for the Product Detail Page ***
//*********************************************

function processPreselectsD(xmlDoc)
{
  var selectValues=xmlDoc.getElementsByTagName('currentSelection');
  for(i=0;i<selectValues.length;i++)
  {
      var select=document.getElementById('skuSelectorD'+selectValues[i].getAttribute('select'));
      var options =select.getElementsByTagName('option');
      for(j=0;j<options.length;j++)
      {
        if(options[j].value==getText(selectValues[i]))
        {
          select.selectedIndex=j;
        }
      }
  }
  updateDropdownsD();
}

function updateDropdownsD(sel)
{
  var selects=document.getElementById("skuAttributeFormD").getElementsByTagName("select")
  var skuList=productDetailsXMLD.getElementsByTagName("sku")
  var skuIds=new Array();
  var tempNode=null;
  var selectOptNum = -1;
  for(j=0;j<skuList.length;j++)
  {
    skuIds[j]=skuList[j].getAttribute("id");
  }

  for(i=0;i<selects.length;i++)
  {
    var curSelect=selects[i];
    if(curSelect.options[curSelect.selectedIndex].value != "choose")
    {
      var attributeValues=productDetailsXMLD.getElementsByTagName("skuAttribute"+curSelect.name)
      for(k=0;k<attributeValues.length;k++)
      {
        if(getText(attributeValues[k]).unescapeHTML()!=curSelect.options[curSelect.selectedIndex].value) {
        	//Determine which SELECT box the user is selecting, and modify all the others.
			if(curSelect.name == sel.name) {
        		selectOptNum = i;
        	}
            skuIds=skuIds.without((attributeValues[k].parentNode).getAttribute("id"))
        }
        else {
            tempNode=attributeValues[k].parentNode;
			for(p=0;p<skuList.length;p++)
			  {
				if(skuIds[0] == skuList[p].getAttribute("id")) {
					tempNode=skuList[p];
					break;
				}

			  }
		}
      }
    }
  }
  if(skuIds.length==1 && tempNode)
    checkPriceD(skuIds[0],tempNode);

  var selectContent;
  var selectArray;

  for(p=0;p<selects.length;p++)
  {

    var preVal=selects[p].options[selects[p].selectedIndex].value
    selectArray=new Array();
	if (p != selectOptNum) {
		selects[p].innerHTML='';
	}
    //***START**Enhancements for the select options****Display Choose option only when we have more than one option*************
	var attValues=getOptionsArray(productDetailsXMLD.getElementsByTagName("skuAttribute"+selects[p].name))

	if(attValues.length > 1) {
		//Only modify the SELECT boxes that were not selected.
		if( p != selectOptNum) {
			var option=document.createElement("OPTION");
			option.text="choose";
			option.value="choose";
			selects[p].options[0]=new Option("choose","choose");
			for(h=0;h<skuList.length;h++){
				if(skuIds.contains(skuList[h].getAttribute("id"))) {
					selectArray.append(skuList[h].getElementsByTagName("skuAttribute"+selects[p].name)[0]);
				}
			}
			selectArray = getOptionsArray(selectArray);
			for(m=0; m<selectArray.length;m++){
				selects[p].options[m+1]=new Option(selectArray[m],selectArray[m]);
			}
		}
		selects[p].value=preVal;
	}
  else {
		for(h=0;h<skuList.length;h++)
		{
		   if(skuIds.contains(skuList[h].getAttribute("id")))
		      selectArray.append(skuList[h].getElementsByTagName("skuAttribute"+selects[p].name)[0])
		}
		selectArray = getOptionsArray(selectArray)
		for(m=0; m<selectArray.length;m++)
		{
		    selects[p].options[m]=new Option(selectArray[m],selectArray[m])
	}
		selects[p].value=selectArray;
	}
  }
}


function checkInputsAndSubmitD(submitButton, isEdit)
{
  var errorArray=new Array();
  var quantity=-1;
  if (prod_merchant_type == "DM") {
  quantity=document.getElementById('mbp_productDetailDM_quantitySelectD').value
  } else {
  quantity=1
  }
  if( quantity<1)
    errorArray[0]="Quantity"
  var selects=document.getElementById('skuAttributeFormD').getElementsByTagName('select')
  for(i=0;i<selects.length;i++)
  {
    if(selects[i].options[selects[i].selectedIndex].value=="choose")
      errorArray.append(selects[i].name)
  }
  if(errorArray.length>0)
     alert("Please check the following fields:" +errorArray);
  else
  {

    document.getElementById('productQuantityD').value=quantity
    document.getElementById('productSkuIdD').value=possibleCheckoutSku
    document.getElementById('productProductIdD').value=prod_idD
    document.getElementById('addToOrderHiddenD').value = "Add"

    var adjustQuantity = quantity;
    if(isEdit)
    {
      adjustQuantity = quantity - skuQuantity;  //this is to update omniture correctly
      if(adjustQuantity > 0)
        scAdd(prod_idD,prod_priceD,adjustQuantity,prod_merchant_type);
      else
        scRemove(prod_idD, prod_priceD, adjustQuantity*-1, prod_merchant_type)

      document.getElementById('addToCartD').submit()
    }
    else
    {
      scAdd(prod_idD,prod_priceD,quantity,prod_merchant_type);
      submitActionD();
    }
  }
  return false;
}

function submitActionD()
{
          var addForm=$('addToCartD')
          if(addForm != null)
          {
            addForm.action='/estore/browse/xml/addItemSuccessXML.jsp'

           addForm.request({
              onComplete: checkAddToBagResponse
            })
          }
}

function changeImagesD(val) {
	var selColor = val.value;
	var color, skuId;
	skuIds = getSkuIds(productDetailsXMLD);
	for(i=0; i<skuIds.length; i++) {
		color = skuIds[i].substring(0, skuIds[i].indexOf(':'));

		if(selColor == color ){
			skuId = skuIds[i].substring(skuIds[i].indexOf(':')+1);
			changeAllImagesColorD(skuId);
			borderSkuSwatchImagesD(skuId);
			break;
		}
	}
}

function changeSkuColorD(val)
{
	var skuId = val.substring(0, val.indexOf('_'));
	skuId = skuId.replace(/^\s+|\s+$/g,"");
	var selVal = val.substring(val.indexOf('_')+1, val.indexOf(';'));
	var url = val.substring(val.indexOf(';')+1);

	var selectobject=document.getElementById("skuSelectorDcolor")
	for (var i=0; i<selectobject.length; i++){
		if(selVal == selectobject.options[i].value) {
			selectobject.options[i].selected = val;
			updateDropdownsD(selectobject.options[i]);
			break;
		}
	}
	borderSkuSwatchImagesD(skuId);
	changeAllImagesColorD(skuId);

}

function borderClickedImageD(imageType, url, skuId) {
	var iType, imageURL, url1, url2, url3;

	for(i=0;i<smallImagesTypesD.length; i++) {
		iType = smallImagesTypesD[i].substring(0,smallImagesTypesD[i].indexOf(':'));

		imageURL = smallImagesTypesD[i].substring(smallImagesTypesD[i].indexOf(':')+1);
		imageURL = imageURL.replace(/^\s+|\s+$/g,"");

		if(skuId != null && skuId != '') {
			url1 = imageURL.substring(0,imageURL.lastIndexOf('/'));
			url2 = url1.substring(0,url1.lastIndexOf('/')+1);
			url3 = imageURL.substring(imageURL.lastIndexOf('/'));
			imageURL = url2 + skuId + url3;
			smallImagesTypesD[i] = iType + ":" +imageURL;
		}
		if (document.getElementById(iType) == null)
            continue;

		if(iType == imageType) {
			document.getElementById(iType).innerHTML = '<a href="javascript:borderClickedImageD(\''+iType+'\',\''+imageURL+'\',\'\'); "><img src="'+imageURL+'" class="mbp_productDetailDM_largeImageOn" /></a>';
		} else {
			document.getElementById(iType).innerHTML = '<a href="javascript:borderClickedImageD(\''+iType+'\',\''+imageURL+'\',\'\'); "><img src="'+imageURL+'" class="mbp_productDetail_largeImage" /></a>';
		}
	}
	refreshLargeImageD(url);

}

function refreshLargeImageD(url) {
	if(url.lastIndexOf('_') > -1)
  {
    url=url.substring(0,url.lastIndexOf('_'));
    url+="_213x326.jpg";
   }
   content = '<a href="javascript:doPopup(\''+url+'\');"><img src="'+url+'" class="mbp_productDetailDM_largeImage" /></a>';
   document.getElementById('largeProductDisplayD').innerHTML = content;
}

function changeAllImagesColorD(skuId) {
	var largeProductContent = document.getElementById('largeProductDisplayD').innerHTML;

	largeProductContent = largeProductContent.substring(largeProductContent.indexOf('src=')+5);

	largeProductContent = largeProductContent.substring(0,largeProductContent.indexOf('>')-1);

	url1 = largeProductContent.substring(0,largeProductContent.lastIndexOf('/'));
	url2 = url1.substring(0,url1.lastIndexOf('/')+1);
	url3 = largeProductContent.substring(largeProductContent.lastIndexOf('/'));
	largeProductContent = url2 + skuId + url3;

	//Replace the skuId with the productId so ImageCacher will pickup image. www-6660
	largeProductContent = largeProductContent.replace(skuId, prod_idD); 

	borderClickedImageD('', largeProductContent, skuId);
}

function checkPriceD(skuId,Node)
{
  possibleCheckoutSku=skuId;
  var listprice=parseFloat(getText(Node.getElementsByTagName('listprice')[0]))
  var saleprice=parseFloat(getText(Node.getElementsByTagName('saleprice')[0]))
  var percentoff=(100*(1-(saleprice/listprice))).toFixed(0);
  document.getElementById('salepriceD').innerHTML=saleprice.toFixed(2)
  if(saleprice<listprice)
  {
  document.getElementById('listpriceD').innerHTML= '$' + listprice.toFixed(2)
  document.getElementById('percentoffD').innerHTML=percentoff + '%'
  }
}

function borderSkuSwatchImagesD(skuId) {
	var skuSwatches = getSkuSwatches(productDetailsXMLD);
	var sId;
	for(i=0;i<skuSwatches.length;i++) {
		sId = skuSwatches[i].substring(0,skuSwatches[i].indexOf('_'));
		sId = sId.replace(/^\s+|\s+$/g,"");
		if(skuId == sId) {
			document.getElementById(sId).innerHTML = ' <a href="javascript:changeSkuColorD(\''+skuSwatches[i]+'\')"><img src="'+ skuSwatches[i].substring(skuSwatches[i].indexOf(';')+1) +'" class="mbp_productDetailDM_largeImageOn" /></a>';
		}else {
			document.getElementById(sId).innerHTML = ' <a href="javascript:changeSkuColorD(\''+skuSwatches[i]+'\')"><img src="'+ skuSwatches[i].substring(skuSwatches[i].indexOf(';')+1) +'" class="mbp_productDetailDM_smallImageOn" /></a>';
		}
	}
}


	var myBagHTML     = "";
	var myAccountHTML = "";

	function getMyBag() {
		//SiteCatalyst-->
		scView()
	    //End SiteCatalyst -->
		var myBagURL = "/estore/cart/myBagQuickView.jsp";
		importXML(myBagURL,displayMyBag)
	}

	function closeMyBag() {
		PositionedPopup.hide();
	}

	function displayMyBag(xmlDoc) {
	    myBagHTML = getText(xmlDoc.getElementsByTagName('viewMyBag')[0]);
	    PositionedPopup.setContents(myBagHTML);

	    //jira www-6346 start
	    //PositionedPopup.setPosition('myBagPopup',-150,15);
	    PositionedPopup.setPositionOfBag('myBagPopup',0,15);
	    //jira www-6346 ends
	    
	    PositionedPopup.show();
	    document.body.scrollTop = 0;
	    setTimeout(function() {
	    	$('myBagPopup').focus(); }, 50);
	}

  //This function will update the my bag section of the header
	function updateMyBag(xmlDoc)
  {
    if(!xmlDoc)
    {
	    var url="/estore/include/xml/myBagQuickViewUpdateXML.jsp"
	    importXML(url, updateMyBag)
    }
    else
    {
      var content=getText(xmlDoc.getElementsByTagName('pagecontent')[0])
      var myBagDiv=$('myBagPopup')
      if(myBagDiv)
        myBagDiv.innerHTML=content
      getMyBag();
    }
  }

  //MyBagQuickView needs to be notified when items have been added the the bag so here it is subscribing itself
  //to the productViewer listener array.
  function addMyBagToProductViewerListeners()
  {
    productViewerListeners.push(updateMyBag)
  }
  addBodyOnloadHandlerOrRun(addMyBagToProductViewerListeners)

	function orderPop(url) {
		importXML(url, displayOrderPopup)
	}

	function displayOrderPopup(xmlDoc) {
	    myAccountHTML = getText(xmlDoc.getElementsByTagName('order')[0]);

		FancyPopup.hide();
	    FancyPopup.setContents(myAccountHTML);
		FancyPopup.show();

	    document.body.scrollTop = 0;
	    setTimeout(function() {
	    	$('orderPopup').focus(); }, 50);
	}


	function accountPop(inURI) {

		importXML(inURI,displayAccountPopup)
	}

	function displayAccountPopup(xmlDoc) {

	   myAccountHTML = getText(xmlDoc.getElementsByTagName('viewAccountStuff')[0]);

	    //SimplePopup.oneShotCentered(myAccountHTML);
		PositionedPopup.setContents(myAccountHTML);
	    PositionedPopup.setPosition('accountPopup',250,-110);
	    PositionedPopup.show();
        var classname = document.getElementById("tableBorder").getAttribute("class") + '_account';
        document.getElementById("tableBorder").setAttribute("class", classname);
	    document.body.scrollTop = 0;
	    setTimeout(function() {
	    	$('accountPopup').focus(); }, 50);
	}
   function rewardsPopup(inURI) {

        importXML(inURI,displayRewardsPopup)
    }

    function displayRewardsPopup(xmlDoc) {

       myAccountHTML = getText( xmlDoc.getElementsByTagName('viewRewardsText')[0]);

        //SimplePopup.oneShotCentered(myAccountHTML);
        PositionedPopup.setContents(myAccountHTML);
        PositionedPopup.setPosition ('rewardsPopup',50,-100);
        PositionedPopup.show();
        document.body.scrollTop = 0;
        setTimeout(function() {
            $('accountPopup').focus(); }, 50);
    }

    function addressPop(inURI, id) {
		var v = importDWRXML(inURI, id, displayAddressPopup)

	}

	function displayAddressPopup(id, xmlDoc) {

	    myAccountHTML = getText(xmlDoc.getElementsByTagName('viewAccountStuff')[0]);
		PositionedPopup.setContents(myAccountHTML);
	    PositionedPopup.setPosition('addressPopup',200,-250);
	    PositionedPopup.show();
        var classname = document.getElementById("tableBorder").getAttribute("class") + '_account';
        document.getElementById("tableBorder").setAttribute("class", classname);
	    document.body.scrollTop = 0;
	    setTimeout(function() {
	    	$('addressPopup').focus(); }, 50);
	}

	function showRecipient(object, inURI)  {

		if(object.value == '-1') {
			importXML(inURI, showNewRecipient)
		}else {
			document.getElementById('recipientId').value = object.value;
			document.getElementById('newRecipient').innerHTML="";
		}
	}

	function showNewRecipient(xmlDoc) {
		myAccountHTML = getText(xmlDoc.getElementsByTagName('recipient')[0]);

		document.getElementById('newRecipient').innerHTML=myAccountHTML;
	}

	function refresh(){
		if (window.location.reload)
			window.location.reload( true );
		else if (window.location.replace)
			window.location.replace(unescape(location.href));
		else
			window.location.href=unescape(location.href);
	}


	function test(req) {
		AddressBookFormHandler.handleNewAddress1(req, function(data) {
			DWRUtil.setValue("demoReply", "i am here");
		});
  	}

	function getError(inURI) {
		importXML(inURI,setError)
  	}

  	function getAddress(xmlDoc) {
		PositionedPopup.hide();
	  	window.refresh();
	}

	function setError(xmlDoc) {
		var tmp = "<font color='red'><ul>";

	  	for(i=0;i<xmlDoc.length;i++) {
			tmp += "<li>"+xmlDoc[i]+"</li>";
	  	}
	  	tmp += "</ul></font>";
		document.getElementById("errors").innerHTML = tmp;
	}

	function setAddressValues(id) {
		if(id) {
			AddressBookFormHandler.getAddressValues(id, function(data ) {
				if(data == null) {
					SimplePopup.hide();
					//new Effect.Puff('effect'); window.setTimeout('Effect.Appear(\'effect\', {duration:.3})',2500);
				} else {
					DWRUtil.setValue('ma_ad_addBookPop_addressForm_addressName', data.addressName);
					DWRUtil.setValue('ma_ad_addBookPop_addressForm_first', data.firstName);
					DWRUtil.setValue('ma_ad_addBookPop_addressForm_last', data.lastName);
					DWRUtil.setValue('ma_ad_addBookPop_addressForm_co', data.company);
					DWRUtil.setValue('ma_ad_addBookPop_addressForm_add1', data.address1);
					DWRUtil.setValue('ma_ad_addBookPop_addressForm_add2', data.address2);
					DWRUtil.setValue('ma_ad_addBookPop_addressForm_city', data.city);
					DWRUtil.setValue('ma_ad_addBookPop_addressForm_state', data.state);
					DWRUtil.setValue('ma_ad_addBookPop_addressForm_zip', data.postalCode);

				}
			});
		}
	}

  	function addEditAddress(handleType) {

		if(document.getElementById('ds_nickname_qs') && DWRUtil.getValue('ds_nickname_qs') != null) {
			//document.getElementById('recipientId').value ="";
			ar_createNewRecipientAddressPop('', createRecipient);
		} else {
			addEdditAddressSubmit(handleType);
		}

  	}

	function addEdditAddressSubmit(handleType) {
		 var map = new Object();
		 map.addressName = DWRUtil.getValue('ma_ad_addBookPop_addressForm_addressName');
		 map.firstName = DWRUtil.getValue('ma_ad_addBookPop_addressForm_first');
		 map.lastName = DWRUtil.getValue('ma_ad_addBookPop_addressForm_last');
		 map.companyName = DWRUtil.getValue('ma_ad_addBookPop_addressForm_co');
		 map.address1 = DWRUtil.getValue('ma_ad_addBookPop_addressForm_add1');
		 map.address2 = DWRUtil.getValue('ma_ad_addBookPop_addressForm_add2');
		 map.city = DWRUtil.getValue('ma_ad_addBookPop_addressForm_city');
		 map.state = DWRUtil.getValue('ma_ad_addBookPop_addressForm_state');
		 map.postalCode = DWRUtil.getValue('ma_ad_addBookPop_addressForm_zip');


		 AddressBookFormHandler.addEditAddressDWR(map, handleType, function(data ) {
		 	if(data == null) {
				if (navigator.userAgent.indexOf("Firefox")!=-1) {
					 document.getElementById('addEditAddressBookForm').submit();
				}else if(navigator.userAgent.indexOf("MSIE")!=-1) {
  					 document.addEditAddressBookForm1.submit();
				}
		 	}  else
				setError(data);
		 });
	}
    function showOrderDetail() {
		var map = new Object();

		map.orderId = DWRUtil.getValue('ma_orderId');
		map.emailAddr = DWRUtil.getValue('ma_emailAddr');

		DwrUtil.orderLookupValidatorDWR(map, function(data) {
			if(data == null) {

				document.getElementById('validateOrder').value="validateOrder";
				orderPop('/estore/account/order_detail_anonymous.jsp?allowGuest=true&orderId='+DWRUtil.getValue('ma_orderId'))
			}
			else
				setError(data);
		});
	}


	function createImPurchaseHistory(productId, skuId, quantity, unitPrice, userId, url) {

		var map = new Object();

		map.productId = productId;
		map.skuId = skuId;
		map.quantity = quantity;
		map.unitPrice = unitPrice;
		map.userId = userId;

		DwrUtil.createImPurchaseHistory(map, function(data) {

			if (data != null) 	{
				location.href= url+"estore/checkout/index.jsp?errorString="+data;
			}	else {
				location.href= url+"estore/checkout/index.jsp";
			}

		});
	}


	function buildDynamicSaveRelationshipSelectQS(xmlDoc) {

		if(!xmlDoc) {
			var url = '/jsp/xml/relationshipsByAgeGenderXML.jsp?realAge=true&'
			url += 'gender='
			if(document.getElementById('ds_gender_male_qs').checked)
				url += 'M'
			else url += 'F'
			url += '&age=' + (document.getElementById('ds_age_qs').value)

			importXML(url, buildDynamicSaveRelationshipSelectQS)
			return
		}
		if( ! document.getElementById('dynamicPBSaveRelationshipSelect') ) {
			//perhaps the user closed it before the xml returned
			return
		}
		buildDropDown(xmlDoc, document.getElementById('dynamicPBSaveRelationshipSelect'))
	}

	function disableEnterKey(e) {
	     var key;

	     if(window.event)
	          key = window.event.keyCode;     //IE
	     else
	          key = e.which;     //firefox

	     if(key == 13)
	          return false;
	     else
	          return true;
	}


	function viewOder(url){
		location.href = url;
	}

	function chek2PopupSaved(evt){
	   var sUrl=window.location.search;
	   if(sUrl.indexOf("saved=true")>0)
		   window.showSavedItemsPopup();
	}
    if (window.addEventListener)
    	window.addEventListener("load", chek2PopupSaved, false);
    else if (window.attachEvent)    // for IE
        window.attachEvent("onload", chek2PopupSaved);
    else if (document.getElementById) // for old browsers
        window.onload=chek2PopupSaved;

// DO NOT MODIFY BY HAND
// This file is generated by DWR using the following URL: http://<hostname>/dwr/interface/AddressBookFormHandler.js
// The generated file from the servlet is not cached because we are using version 1.0 of DWR (this is fixed in
// in version 2.0).  This file will need to be regenerated if the AddressBookFormHandler.java class changes it's
// public interface.
//
// To regenerate this file, load up http://localhost/dwr/interface/AddressBookFormHandler.js in a web browser and save the
// generated js file as this file (remember to put this header at the top of the generated file) and save back
// to the correct directory.

function AddressBookFormHandler() { }
AddressBookFormHandler._path = '/dwr';

AddressBookFormHandler.test = function(callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'test', callback);
}

AddressBookFormHandler.getYears = function(callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'getYears', callback);
}

AddressBookFormHandler.getProfile = function(callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'getProfile', callback);
}

AddressBookFormHandler.setProfile = function(p0, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'setProfile', p0, callback);
}

AddressBookFormHandler.checkFormRedirect = function(p0, p1, p2, p3, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'checkFormRedirect', p0, p1, p2, p3, callback);
}

AddressBookFormHandler.getFormFieldExceptions = function(callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'getFormFieldExceptions', callback);
}

AddressBookFormHandler.hasFormFieldException = function(p0, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'hasFormFieldException', p0, callback);
}

AddressBookFormHandler.isSecureURLEncode = function(callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'isSecureURLEncode', callback);
}

AddressBookFormHandler.setSecureURLEncode = function(p0, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'setSecureURLEncode', p0, callback);
}

AddressBookFormHandler.setProfileManager = function(p0, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'setProfileManager', p0, callback);
}

AddressBookFormHandler.getProfileManager = function(callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'getProfileManager', callback);
}

AddressBookFormHandler.getEditValue = function(callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'getEditValue', callback);
}

AddressBookFormHandler.setEditAddressId = function(p0, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'setEditAddressId', p0, callback);
}

AddressBookFormHandler.getEditAddressId = function(callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'getEditAddressId', callback);
}

AddressBookFormHandler.setRemoveAddress = function(p0, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'setRemoveAddress', p0, callback);
}

AddressBookFormHandler.getRemoveAddress = function(callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'getRemoveAddress', callback);
}

AddressBookFormHandler.setDefaultBillingAddressId = function(p0, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'setDefaultBillingAddressId', p0, callback);
}

AddressBookFormHandler.getDefaultBillingAddressId = function(callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'getDefaultBillingAddressId', callback);
}

AddressBookFormHandler.setSelectDefaultShippingAddress = function(p0, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'setSelectDefaultShippingAddress', p0, callback);
}

AddressBookFormHandler.getSelectDefaultShippingAddress = function(callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'getSelectDefaultShippingAddress', callback);
}

AddressBookFormHandler.setSetDefaultBilling = function(p0, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'setSetDefaultBilling', p0, callback);
}

AddressBookFormHandler.isSetDefaultBilling = function(callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'isSetDefaultBilling', callback);
}

AddressBookFormHandler.setSetDefaultShipping = function(p0, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'setSetDefaultShipping', p0, callback);
}

AddressBookFormHandler.isSetDefaultShipping = function(callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'isSetDefaultShipping', callback);
}

AddressBookFormHandler.setUpdateAddressSuccessURL = function(p0, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'setUpdateAddressSuccessURL', p0, callback);
}

AddressBookFormHandler.getUpdateAddressSuccessURL = function(callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'getUpdateAddressSuccessURL', callback);
}

AddressBookFormHandler.setUpdateAddressErrorURL = function(p0, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'setUpdateAddressErrorURL', p0, callback);
}

AddressBookFormHandler.getUpdateAddressErrorURL = function(callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'getUpdateAddressErrorURL', callback);
}

AddressBookFormHandler.setCreateAddressSuccessURL = function(p0, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'setCreateAddressSuccessURL', p0, callback);
}

AddressBookFormHandler.getCreateAddressSuccessURL = function(callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'getCreateAddressSuccessURL', callback);
}

AddressBookFormHandler.setCreateAddressErrorURL = function(p0, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'setCreateAddressErrorURL', p0, callback);
}

AddressBookFormHandler.getCreateAddressErrorURL = function(callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'getCreateAddressErrorURL', callback);
}

AddressBookFormHandler.handleSelectDefaultBillingAddress = function(p0, p1, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'handleSelectDefaultBillingAddress', p0, p1, callback);
}

AddressBookFormHandler.handleClearDefaultAddress = function(p0, p1, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'handleClearDefaultAddress', p0, p1, callback);
}

AddressBookFormHandler.handleSelectDefaultShippingAddress = function(p0, p1, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'handleSelectDefaultShippingAddress', p0, p1, callback);
}

AddressBookFormHandler.handleNewAddress = function(p0, p1, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'handleNewAddress', p0, p1, callback);
}

AddressBookFormHandler.getAddressValues = function(p0, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'getAddressValues', p0, callback);
}

AddressBookFormHandler.addEditAddressDWR = function(p0, p1, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'addEditAddressDWR', p0, p1, callback);
}

AddressBookFormHandler.handleUpdateAddress = function(p0, p1, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'handleUpdateAddress', p0, p1, callback);
}

AddressBookFormHandler.handleRemoveAddress = function(p0, p1, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'handleRemoveAddress', p0, p1, callback);
}

AddressBookFormHandler.getAddressInfoValidator = function(callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'getAddressInfoValidator', callback);
}

AddressBookFormHandler.setAddressInfoValidator = function(p0, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'setAddressInfoValidator', p0, callback);
}

AddressBookFormHandler.setYears = function(p0, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'setYears', p0, callback);
}

AddressBookFormHandler.setSiteConfiguration = function(p0, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'setSiteConfiguration', p0, callback);
}

AddressBookFormHandler.getSiteConfiguration = function(callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'getSiteConfiguration', callback);
}

AddressBookFormHandler.getTransactionManager = function(callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'getTransactionManager', callback);
}

AddressBookFormHandler.setTransactionManager = function(p0, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'setTransactionManager', p0, callback);
}

AddressBookFormHandler.getMessageSource = function(callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'getMessageSource', callback);
}

AddressBookFormHandler.setMessageSource = function(p0, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'setMessageSource', p0, callback);
}

AddressBookFormHandler.setDeferForwardsAndRedirects = function(p0, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'setDeferForwardsAndRedirects', p0, callback);
}

AddressBookFormHandler.isDeferForwardsAndRedirects = function(callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'isDeferForwardsAndRedirects', callback);
}

AddressBookFormHandler.addFormException = function(p0, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'addFormException', p0, callback);
}

AddressBookFormHandler.addUncheckedFormException = function(p0, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'addUncheckedFormException', p0, callback);
}

AddressBookFormHandler.beforeSet = function(p0, p1, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'beforeSet', p0, p1, callback);
}

AddressBookFormHandler.afterSet = function(p0, p1, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'afterSet', p0, p1, callback);
}

AddressBookFormHandler.handleFormException = function(p0, p1, p2, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'handleFormException', p0, p1, p2, callback);
}

AddressBookFormHandler.handleUncheckedFormException = function(p0, p1, p2, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'handleUncheckedFormException', p0, p1, p2, callback);
}

AddressBookFormHandler.getMessageType = function(callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'getMessageType', callback);
}

AddressBookFormHandler.setMessageType = function(p0, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'setMessageType', p0, callback);
}

AddressBookFormHandler.setFormName = function(p0, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'setFormName', p0, callback);
}

AddressBookFormHandler.getFormName = function(callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'getFormName', callback);
}

AddressBookFormHandler.setMessagePort = function(p0, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'setMessagePort', p0, callback);
}

AddressBookFormHandler.getMessagePort = function(callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'getMessagePort', callback);
}

AddressBookFormHandler.getFormError = function(callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'getFormError', callback);
}

AddressBookFormHandler.handleCancel = function(p0, p1, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'handleCancel', p0, p1, callback);
}

AddressBookFormHandler.resetFormExceptions = function(callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'resetFormExceptions', callback);
}

AddressBookFormHandler.getCancelURL = function(callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'getCancelURL', callback);
}

AddressBookFormHandler.setSendMessages = function(p0, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'setSendMessages', p0, callback);
}

AddressBookFormHandler.getSendMessages = function(callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'getSendMessages', callback);
}

AddressBookFormHandler.setUseForwards = function(p0, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'setUseForwards', p0, callback);
}

AddressBookFormHandler.isUseForwards = function(callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'isUseForwards', callback);
}

AddressBookFormHandler.createFormSubmissionMessage = function(p0, p1, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'createFormSubmissionMessage', p0, p1, callback);
}

AddressBookFormHandler.getFormExceptions = function(callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'getFormExceptions', callback);
}

AddressBookFormHandler.hasUncheckedFormExceptions = function(callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'hasUncheckedFormExceptions', callback);
}

AddressBookFormHandler.getUncheckedFormExceptions = function(callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'getUncheckedFormExceptions', callback);
}

AddressBookFormHandler.setRestorableForm = function(p0, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'setRestorableForm', p0, callback);
}

AddressBookFormHandler.isRestorableForm = function(callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'isRestorableForm', callback);
}

AddressBookFormHandler.setCheckForValidSession = function(p0, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'setCheckForValidSession', p0, callback);
}

AddressBookFormHandler.getCheckForValidSession = function(callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'getCheckForValidSession', callback);
}

AddressBookFormHandler.isValidSession = function(p0, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'isValidSession', p0, callback);
}

AddressBookFormHandler.getPropertyExceptions = function(callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'getPropertyExceptions', callback);
}

AddressBookFormHandler.setCancelURL = function(p0, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'setCancelURL', p0, callback);
}

AddressBookFormHandler.afterGet = function(p0, p1, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'afterGet', p0, p1, callback);
}

AddressBookFormHandler.beforeGet = function(p0, p1, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'beforeGet', p0, p1, callback);
}

AddressBookFormHandler.getName = function(callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'getName', callback);
}

AddressBookFormHandler.resolveName = function(p0, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'resolveName', p0, callback);
}

AddressBookFormHandler.resolveName = function(p0, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'resolveName', p0, callback);
}

AddressBookFormHandler.resolveName = function(p0, p1, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'resolveName', p0, p1, callback);
}

AddressBookFormHandler.resolveName = function(p0, p1, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'resolveName', p0, p1, callback);
}

AddressBookFormHandler.getRoot = function(callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'getRoot', callback);
}

AddressBookFormHandler.isRunning = function(callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'isRunning', callback);
}

AddressBookFormHandler.startService = function(p0, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'startService', p0, callback);
}

AddressBookFormHandler.stopService = function(callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'stopService', callback);
}

AddressBookFormHandler.getAbsoluteName = function(callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'getAbsoluteName', callback);
}

AddressBookFormHandler.logInfo = function(p0, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'logInfo', p0, callback);
}

AddressBookFormHandler.logInfo = function(p0, p1, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'logInfo', p0, p1, callback);
}

AddressBookFormHandler.logInfo = function(p0, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'logInfo', p0, callback);
}

AddressBookFormHandler.logError = function(p0, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'logError', p0, callback);
}

AddressBookFormHandler.logError = function(p0, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'logError', p0, callback);
}

AddressBookFormHandler.logError = function(p0, p1, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'logError', p0, p1, callback);
}

AddressBookFormHandler.doStartService = function(callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'doStartService', callback);
}

AddressBookFormHandler.doStopService = function(callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'doStopService', callback);
}

AddressBookFormHandler.getServiceInfo = function(callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'getServiceInfo', callback);
}

AddressBookFormHandler.setServiceInfo = function(p0, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'setServiceInfo', p0, callback);
}

AddressBookFormHandler.addLogListener = function(p0, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'addLogListener', p0, callback);
}

AddressBookFormHandler.removeLogListener = function(p0, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'removeLogListener', p0, callback);
}

AddressBookFormHandler.getLogListeners = function(callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'getLogListeners', callback);
}

AddressBookFormHandler.getLogListenerCount = function(callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'getLogListenerCount', callback);
}

AddressBookFormHandler.sendLogEvent = function(p0, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'sendLogEvent', p0, callback);
}

AddressBookFormHandler.nameContextElementBound = function(p0, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'nameContextElementBound', p0, callback);
}

AddressBookFormHandler.nameContextElementUnbound = function(p0, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'nameContextElementUnbound', p0, callback);
}

AddressBookFormHandler.getNameContext = function(callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'getNameContext', callback);
}

AddressBookFormHandler.getNucleus = function(callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'getNucleus', callback);
}

AddressBookFormHandler.setNucleus = function(p0, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'setNucleus', p0, callback);
}

AddressBookFormHandler.getServiceConfiguration = function(callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'getServiceConfiguration', callback);
}

AddressBookFormHandler.isLoggingInfo = function(callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'isLoggingInfo', callback);
}

AddressBookFormHandler.setLoggingInfo = function(p0, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'setLoggingInfo', p0, callback);
}

AddressBookFormHandler.isLoggingWarning = function(callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'isLoggingWarning', callback);
}

AddressBookFormHandler.setLoggingWarning = function(p0, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'setLoggingWarning', p0, callback);
}

AddressBookFormHandler.isLoggingError = function(callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'isLoggingError', callback);
}

AddressBookFormHandler.setLoggingError = function(p0, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'setLoggingError', p0, callback);
}

AddressBookFormHandler.isLoggingDebug = function(callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'isLoggingDebug', callback);
}

AddressBookFormHandler.setLoggingDebug = function(p0, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'setLoggingDebug', p0, callback);
}

AddressBookFormHandler.isLoggingTrace = function(callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'isLoggingTrace', callback);
}

AddressBookFormHandler.setLoggingTrace = function(p0, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'setLoggingTrace', p0, callback);
}

AddressBookFormHandler.logWarning = function(p0, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'logWarning', p0, callback);
}

AddressBookFormHandler.logWarning = function(p0, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'logWarning', p0, callback);
}

AddressBookFormHandler.logWarning = function(p0, p1, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'logWarning', p0, p1, callback);
}

AddressBookFormHandler.logDebug = function(p0, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'logDebug', p0, callback);
}

AddressBookFormHandler.logDebug = function(p0, p1, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'logDebug', p0, p1, callback);
}

AddressBookFormHandler.logDebug = function(p0, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'logDebug', p0, callback);
}

AddressBookFormHandler.logTrace = function(p0, p1, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'logTrace', p0, p1, callback);
}

AddressBookFormHandler.logTrace = function(p0, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'logTrace', p0, callback);
}

AddressBookFormHandler.logTrace = function(p0, callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'logTrace', p0, callback);
}

AddressBookFormHandler.getAdminServlet = function(callback) {
    DWREngine._execute(AddressBookFormHandler._path, 'AddressBookFormHandler', 'getAdminServlet', callback);
}
// DO NOT MODIFY BY HAND
// This file is generated by DWR using the following URL: http://<hostname>/dwr/interface/DwrUtil.js
// The generated file from the servlet is not cached because we are using version 1.0 of DWR (this is fixed in
// in version 2.0).  This file will need to be regenerated if the DwrUtil.java class changes it's
// public interface.
//
// To regenerate this file, load up http://localhost/dwr/interface/DwrUtil.js in a web browser and save the
// generated js file as this file (remember to put this header at the top of the generated file for others
// to know what's going on) and save back to the correct directory.
function DwrUtil() { }
DwrUtil._path = '/dwr';

DwrUtil.isNumber = function(p0, callback) {
    DWREngine._execute(DwrUtil._path, 'DwrUtil', 'isNumber', p0, callback);
}

DwrUtil.setProfileManager = function(p0, callback) {
    DWREngine._execute(DwrUtil._path, 'DwrUtil', 'setProfileManager', p0, callback);
}

DwrUtil.getProfileManager = function(callback) {
    DWREngine._execute(DwrUtil._path, 'DwrUtil', 'getProfileManager', callback);
}

DwrUtil.getAddressInfoValidator = function(callback) {
    DWREngine._execute(DwrUtil._path, 'DwrUtil', 'getAddressInfoValidator', callback);
}

DwrUtil.setAddressInfoValidator = function(p0, callback) {
    DWREngine._execute(DwrUtil._path, 'DwrUtil', 'setAddressInfoValidator', p0, callback);
}

DwrUtil.newEditShipAddress = function(p0, p1, callback) {
    DWREngine._execute(DwrUtil._path, 'DwrUtil', 'newEditShipAddress', p0, p1, callback);
}

DwrUtil.editShippingAddress = function(p0, callback) {
    DWREngine._execute(DwrUtil._path, 'DwrUtil', 'editShippingAddress', p0, callback);
}

DwrUtil.creditCardValidatorDWR = function(p0, p1, callback) {
    DWREngine._execute(DwrUtil._path, 'DwrUtil', 'creditCardValidatorDWR', p0, p1, callback);
}

DwrUtil.validateCardValues = function(p0, callback) {
    DWREngine._execute(DwrUtil._path, 'DwrUtil', 'validateCardValues', p0, callback);
}

DwrUtil.orderLookupValidatorDWR = function(p0, callback) {
    DWREngine._execute(DwrUtil._path, 'DwrUtil', 'orderLookupValidatorDWR', p0, callback);
}

DwrUtil.createImPurchaseHistory = function(p0, callback) {
    DWREngine._execute(DwrUtil._path, 'DwrUtil', 'createImPurchaseHistory', p0, callback);
}

DwrUtil.getCreditCardInfoValidator = function(callback) {
    DWREngine._execute(DwrUtil._path, 'DwrUtil', 'getCreditCardInfoValidator', callback);
}

DwrUtil.setCreditCardInfoValidator = function(p0, callback) {
    DWREngine._execute(DwrUtil._path, 'DwrUtil', 'setCreditCardInfoValidator', p0, callback);
}

DwrUtil.setWalletForm = function(p0, callback) {
    DWREngine._execute(DwrUtil._path, 'DwrUtil', 'setWalletForm', p0, callback);
}

DwrUtil.getWalletForm = function(callback) {
    DWREngine._execute(DwrUtil._path, 'DwrUtil', 'getWalletForm', callback);
}

DwrUtil.getOrderLookupInfoValidator = function(callback) {
    DWREngine._execute(DwrUtil._path, 'DwrUtil', 'getOrderLookupInfoValidator', callback);
}

DwrUtil.setOrderLookupInfoValidator = function(p0, callback) {
    DWREngine._execute(DwrUtil._path, 'DwrUtil', 'setOrderLookupInfoValidator', p0, callback);
}

DwrUtil.getImPurchaseHistoryInfoValidator = function(callback) {
    DWREngine._execute(DwrUtil._path, 'DwrUtil', 'getImPurchaseHistoryInfoValidator', callback);
}

DwrUtil.setImPurchaseHistoryInfoValidator = function(p0, callback) {
    DWREngine._execute(DwrUtil._path, 'DwrUtil', 'setImPurchaseHistoryInfoValidator', p0, callback);
}

DwrUtil.getImPurchaseHistoryTools = function(callback) {
    DWREngine._execute(DwrUtil._path, 'DwrUtil', 'getImPurchaseHistoryTools', callback);
}

DwrUtil.setImPurchaseHistoryTools = function(p0, callback) {
    DWREngine._execute(DwrUtil._path, 'DwrUtil', 'setImPurchaseHistoryTools', p0, callback);
}
// DO NOT MODIFY BY HAND
// This file is generated by DWR using the following URL: http://<hostname>/dwr/interface/ServletUtil.js
// The generated file from the servlet is not cached because we are using version 1.0 of DWR (this is fixed in
// in version 2.0).  This file will need to be regenerated if the ServletUtil.java class changes it's
// public interface.
//
// To regenerate this file, load up http://localhost/dwr/interface/ServletUtil.js in a web browser and save the
// generated js file as this file (remember to put this header at the top of the generated file) and save back
// to the correct directory.

function ServletUtil() { }
ServletUtil._path = '/dwr';

ServletUtil.printStackTrace = function(p0, p1, callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'printStackTrace', p0, p1, callback);
}

ServletUtil.toString = function(p0, callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'toString', p0, callback);
}

ServletUtil.toString = function(p0, callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'toString', p0, callback);
}

ServletUtil.toString = function(p0, callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'toString', p0, callback);
}

ServletUtil.toString = function(p0, callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'toString', p0, callback);
}

ServletUtil.toString = function(p0, callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'toString', p0, callback);
}

ServletUtil.toString = function(p0, callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'toString', p0, callback);
}

ServletUtil.toString = function(p0, callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'toString', p0, callback);
}

ServletUtil.toString = function(p0, callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'toString', p0, callback);
}

ServletUtil.getStackTrace = function(p0, callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'getStackTrace', p0, callback);
}

ServletUtil.getPropertyValue = function(p0, p1, callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'getPropertyValue', p0, p1, callback);
}

ServletUtil.getPropertyValue = function(p0, p1, callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'getPropertyValue', p0, p1, callback);
}

ServletUtil.getRequestDispatcher = function(p1, p2, callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'getRequestDispatcher', false, p1, p2, callback);
}

ServletUtil.getRequestURI = function(p1, p2, callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'getRequestURI', false, p1, p2, callback);
}

ServletUtil.getRequestURI = function(p0, p1, p2, callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'getRequestURI', p0, p1, p2, callback);
}

ServletUtil.getRequestURI = function(p1, callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'getRequestURI', false, p1, callback);
}

ServletUtil.getRequestURI = function(p0, p1, callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'getRequestURI', p0, p1, callback);
}

ServletUtil.getRequestURI = function(p0, callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'getRequestURI', p0, callback);
}

ServletUtil.getRequestURL = function(p1, callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'getRequestURL', false, p1, callback);
}

ServletUtil.loadServlet = function(p0, p1, p2, p3, p4, callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'loadServlet', p0, p1, p2, p3, p4, callback);
}

ServletUtil.pushBody = function(p0, p1, p2, callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'pushBody', p0, p1, p2, callback);
}

ServletUtil.popBody = function(p0, p1, p2, callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'popBody', p0, p1, p2, callback);
}

ServletUtil.getSessionManager = function(callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'getSessionManager', callback);
}

ServletUtil.setInitProperties = function(p0, p2, callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'setInitProperties', p0, false, p2, callback);
}

ServletUtil.getWeblogicJspClasspath = function(callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'getWeblogicJspClasspath', callback);
}

ServletUtil.getWebSphereJspClasspath = function(callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'getWebSphereJspClasspath', callback);
}

ServletUtil.getJBossJspClasspath = function(callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'getJBossJspClasspath', false, callback);
}

ServletUtil.getJBossJspClasspath = function(callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'getJBossJspClasspath', callback);
}

ServletUtil.isDynamoJ2EEServer = function(callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'isDynamoJ2EEServer', callback);
}

ServletUtil.lookupInInitialContext = function(p0, callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'lookupInInitialContext', p0, callback);
}

ServletUtil.getSessionNameContext = function(p0, p2, callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'getSessionNameContext', p0, false, p2, callback);
}

ServletUtil.getDynamoRequest = function(p0, callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'getDynamoRequest', p0, callback);
}

ServletUtil.getDynamoRequest = function(p1, p2, callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'getDynamoRequest', false, p1, p2, callback);
}

ServletUtil.processPostRequestProcessors = function(p0, p1, callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'processPostRequestProcessors', p0, p1, callback);
}

ServletUtil.setCurrentRequest = function(p0, callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'setCurrentRequest', p0, callback);
}

ServletUtil.setCurrentResponse = function(p0, callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'setCurrentResponse', p0, callback);
}

ServletUtil.getUserTransaction = function(callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'getUserTransaction', callback);
}

ServletUtil.fileSize = function(p0, p1, callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'fileSize', p0, p1, callback);
}

ServletUtil.getWebsphereServerName = function(callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'getWebsphereServerName', callback);
}

ServletUtil.getJspClasspath = function(callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'getJspClasspath', false, callback);
}

ServletUtil.flushBeforeInclude = function(p0, callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'flushBeforeInclude', p0, callback);
}

ServletUtil.flushBeforeInclude = function(p0, callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'flushBeforeInclude', p0, callback);
}

ServletUtil.invalidateSessionNameContext = function(callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'invalidateSessionNameContext', false, callback);
}

ServletUtil.getParentSessionId = function(p0, callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'getParentSessionId', p0, callback);
}

ServletUtil.invalidateSession = function(callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'invalidateSession', false, callback);
}

ServletUtil.convertPropertyValue = function(p0, p1, p2, callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'convertPropertyValue', p0, p1, p2, callback);
}

ServletUtil.doPropertySetAsText = function(p0, p1, callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'doPropertySetAsText', p0, p1, callback);
}

ServletUtil.callServlet = function(p0, p1, p2, p3, callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'callServlet', p0, p1, p2, p3, callback);
}

ServletUtil.isUsingURLRewriting = function(callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'isUsingURLRewriting', false, callback);
}

ServletUtil.embed = function(p0, p1, p2, p3, callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'embed', p0, p1, p2, p3, callback);
}

ServletUtil.embed = function(p0, p1, p2, callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'embed', p0, p1, p2, callback);
}

ServletUtil.serviceWithoutIncludeAttributes = function(p0, p1, p2, p3, callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'serviceWithoutIncludeAttributes', p0, p1, p2, p3, callback);
}

ServletUtil.recordAndClearIncludeAttributes = function(callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'recordAndClearIncludeAttributes', false, callback);
}

ServletUtil.execCgi = function(p0, p1, p2, p3, callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'execCgi', p0, p1, p2, p3, callback);
}

ServletUtil.fileLastMod = function(p0, p1, callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'fileLastMod', p0, p1, callback);
}

ServletUtil.formattedDate = function(p0, p1, p2, callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'formattedDate', p0, p1, p2, callback);
}

ServletUtil.setDateFormat = function(p0, p1, callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'setDateFormat', p0, p1, callback);
}

ServletUtil.getUserLocale = function(callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'getUserLocale', callback);
}

ServletUtil.getUserLocale = function(p0, p1, callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'getUserLocale', p0, p1, callback);
}

ServletUtil.getUserLocale = function(p0, callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'getUserLocale', p0, callback);
}

ServletUtil.resolvePathFromRelativeURL = function(p0, p1, callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'resolvePathFromRelativeURL', p0, p1, callback);
}

ServletUtil.escapeHtmlString = function(p0, callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'escapeHtmlString', p0, callback);
}

ServletUtil.escapeHtmlString = function(p0, p1, callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'escapeHtmlString', p0, p1, callback);
}

ServletUtil.setNoCacheHeaders = function(p0, callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'setNoCacheHeaders', p0, callback);
}

ServletUtil.setDynamicContentHeaders = function(p0, p1, callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'setDynamicContentHeaders', p0, p1, callback);
}

ServletUtil.convertStringToDictionary = function(p0, p1, callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'convertStringToDictionary', p0, p1, callback);
}

ServletUtil.resolveTranslatedPathFromURI = function(p0, p1, callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'resolveTranslatedPathFromURI', p0, p1, callback);
}

ServletUtil.valuesMatch = function(p0, p1, callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'valuesMatch', p0, p1, callback);
}

ServletUtil.valuesMatchIgnoreCase = function(p0, p1, callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'valuesMatchIgnoreCase', p0, p1, callback);
}

ServletUtil.setPropertyValue = function(p0, p1, p2, p3, callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'setPropertyValue', p0, p1, p2, p3, callback);
}

ServletUtil.setPropertyValue = function(p0, p1, p2, p3, callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'setPropertyValue', p0, p1, p2, p3, callback);
}

ServletUtil.escapeURLString = function(p0, callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'escapeURLString', p0, callback);
}

ServletUtil.getNewBaseDirectory = function(p0, p2, callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'getNewBaseDirectory', p0, false, p2, callback);
}

ServletUtil.getTagManager = function(p0, p1, p2, p3, p4, callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'getTagManager', p0, p1, p2, p3, p4, callback);
}

ServletUtil.getTagManager = function(p0, p1, p2, p3, callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'getTagManager', p0, p1, p2, p3, callback);
}

ServletUtil.getCurrentRequestURI = function(callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'getCurrentRequestURI', false, callback);
}

ServletUtil.getCurrentContextPath = function(callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'getCurrentContextPath', false, callback);
}

ServletUtil.getCurrentContextPath = function(p1, callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'getCurrentContextPath', false, p1, callback);
}

ServletUtil.getCurrentServletContext = function(callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'getCurrentServletContext', false, callback);
}

ServletUtil.getCurrentServletContextName = function(callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'getCurrentServletContextName', false, callback);
}

ServletUtil.getCurrentServletPath = function(callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'getCurrentServletPath', false, callback);
}

ServletUtil.getCurrentServletPath = function(p1, callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'getCurrentServletPath', false, p1, callback);
}

ServletUtil.getCurrentPathInfo = function(p1, callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'getCurrentPathInfo', false, p1, callback);
}

ServletUtil.getCurrentPathInfo = function(callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'getCurrentPathInfo', false, callback);
}

ServletUtil.getCurrentQueryString = function(callback) {
    DWREngine._execute(ServletUtil._path, 'ServletUtil', 'getCurrentQuerySt