/*!
 * jCarousel - Riding carousels with jQuery
 *   http://sorgalla.com/jcarousel/
 *
 * Copyright (c) 2006 Jan Sorgalla (http://sorgalla.com)
 * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
 * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
 *
 * Built on top of the jQuery library
 *   http://jquery.com
 *
 * Inspired by the "Carousel Component" by Bill Scott
 *   http://billwscott.com/carousel/
 */

(function(i){var q={vertical:false,rtl:false,start:1,offset:1,size:null,scroll:3,visible:null,animation:"normal",easing:"swing",auto:0,wrap:null,initCallback:null,reloadCallback:null,itemLoadCallback:null,itemFirstInCallback:null,itemFirstOutCallback:null,itemLastInCallback:null,itemLastOutCallback:null,itemVisibleInCallback:null,itemVisibleOutCallback:null,buttonNextHTML:"<div></div>",buttonPrevHTML:"<div></div>",buttonNextEvent:"click",buttonPrevEvent:"click",buttonNextCallback:null,buttonPrevCallback:null, itemFallbackDimension:null},r=false;i(window).bind("load.jcarousel",function(){r=true});i.jcarousel=function(a,c){this.options=i.extend({},q,c||{});this.autoStopped=this.locked=false;this.buttonPrevState=this.buttonNextState=this.buttonPrev=this.buttonNext=this.list=this.clip=this.container=null;if(!c||c.rtl===undefined)this.options.rtl=(i(a).attr("dir")||i("html").attr("dir")||"").toLowerCase()=="rtl";this.wh=!this.options.vertical?"width":"height";this.lt=!this.options.vertical?this.options.rtl? "right":"left":"top";for(var b="",d=a.className.split(" "),f=0;f<d.length;f++)if(d[f].indexOf("jcarousel-skin")!=-1){i(a).removeClass(d[f]);b=d[f];break}if(a.nodeName.toUpperCase()=="UL"||a.nodeName.toUpperCase()=="OL"){this.list=i(a);this.container=this.list.parent();if(this.container.hasClass("jcarousel-clip")){if(!this.container.parent().hasClass("jcarousel-container"))this.container=this.container.wrap("<div></div>");this.container=this.container.parent()}else if(!this.container.hasClass("jcarousel-container"))this.container= this.list.wrap("<div></div>").parent()}else{this.container=i(a);this.list=this.container.find("ul,ol").eq(0)}b!==""&&this.container.parent()[0].className.indexOf("jcarousel-skin")==-1&&this.container.wrap('<div class=" '+b+'"></div>');this.clip=this.list.parent();if(!this.clip.length||!this.clip.hasClass("jcarousel-clip"))this.clip=this.list.wrap("<div></div>").parent();this.buttonNext=i(".jcarousel-next",this.container);if(this.buttonNext.size()===0&&this.options.buttonNextHTML!==null)this.buttonNext= this.clip.after(this.options.buttonNextHTML).next();this.buttonNext.addClass(this.className("jcarousel-next"));this.buttonPrev=i(".jcarousel-prev",this.container);if(this.buttonPrev.size()===0&&this.options.buttonPrevHTML!==null)this.buttonPrev=this.clip.after(this.options.buttonPrevHTML).next();this.buttonPrev.addClass(this.className("jcarousel-prev"));this.clip.addClass(this.className("jcarousel-clip")).css({overflow:"hidden",position:"relative"});this.list.addClass(this.className("jcarousel-list")).css({overflow:"hidden", position:"relative",top:0,margin:0,padding:0}).css(this.options.rtl?"right":"left",0);this.container.addClass(this.className("jcarousel-container")).css({position:"relative"});!this.options.vertical&&this.options.rtl&&this.container.addClass("jcarousel-direction-rtl").attr("dir","rtl");var j=this.options.visible!==null?Math.ceil(this.clipping()/this.options.visible):null;b=this.list.children("li");var e=this;if(b.size()>0){var g=0,k=this.options.offset;b.each(function(){e.format(this,k++);g+=e.dimension(this, j)});this.list.css(this.wh,g+100+"px");if(!c||c.size===undefined)this.options.size=b.size()}this.container.css("display","block");this.buttonNext.css("display","block");this.buttonPrev.css("display","block");this.funcNext=function(){e.next()};this.funcPrev=function(){e.prev()};this.funcResize=function(){e.reload()};this.options.initCallback!==null&&this.options.initCallback(this,"init");if(!r&&i.browser.safari){this.buttons(false,false);i(window).bind("load.jcarousel",function(){e.setup()})}else this.setup()}; var h=i.jcarousel;h.fn=h.prototype={jcarousel:"0.2.7"};h.fn.extend=h.extend=i.extend;h.fn.extend({setup:function(){this.prevLast=this.prevFirst=this.last=this.first=null;this.animating=false;this.tail=this.timer=null;this.inTail=false;if(!this.locked){this.list.css(this.lt,this.pos(this.options.offset)+"px");var a=this.pos(this.options.start,true);this.prevFirst=this.prevLast=null;this.animate(a,false);i(window).unbind("resize.jcarousel",this.funcResize).bind("resize.jcarousel",this.funcResize)}}, reset:function(){this.list.empty();this.list.css(this.lt,"0px");this.list.css(this.wh,"10px");this.options.initCallback!==null&&this.options.initCallback(this,"reset");this.setup()},reload:function(){this.tail!==null&&this.inTail&&this.list.css(this.lt,h.intval(this.list.css(this.lt))+this.tail);this.tail=null;this.inTail=false;this.options.reloadCallback!==null&&this.options.reloadCallback(this);if(this.options.visible!==null){var a=this,c=Math.ceil(this.clipping()/this.options.visible),b=0,d=0; this.list.children("li").each(function(f){b+=a.dimension(this,c);if(f+1<a.first)d=b});this.list.css(this.wh,b+"px");this.list.css(this.lt,-d+"px")}this.scroll(this.first,false)},lock:function(){this.locked=true;this.buttons()},unlock:function(){this.locked=false;this.buttons()},size:function(a){if(a!==undefined){this.options.size=a;this.locked||this.buttons()}return this.options.size},has:function(a,c){if(c===undefined||!c)c=a;if(this.options.size!==null&&c>this.options.size)c=this.options.size;for(var b= a;b<=c;b++){var d=this.get(b);if(!d.length||d.hasClass("jcarousel-item-placeholder"))return false}return true},get:function(a){return i(".jcarousel-item-"+a,this.list)},add:function(a,c){var b=this.get(a),d=0,f=i(c);if(b.length===0){var j,e=h.intval(a);for(b=this.create(a);;){j=this.get(--e);if(e<=0||j.length){e<=0?this.list.prepend(b):j.after(b);break}}}else d=this.dimension(b);if(f.get(0).nodeName.toUpperCase()=="LI"){b.replaceWith(f);b=f}else b.empty().append(c);this.format(b.removeClass(this.className("jcarousel-item-placeholder")), a);f=this.options.visible!==null?Math.ceil(this.clipping()/this.options.visible):null;d=this.dimension(b,f)-d;a>0&&a<this.first&&this.list.css(this.lt,h.intval(this.list.css(this.lt))-d+"px");this.list.css(this.wh,h.intval(this.list.css(this.wh))+d+"px");return b},remove:function(a){var c=this.get(a);if(!(!c.length||a>=this.first&&a<=this.last)){var b=this.dimension(c);a<this.first&&this.list.css(this.lt,h.intval(this.list.css(this.lt))+b+"px");c.remove();this.list.css(this.wh,h.intval(this.list.css(this.wh))- b+"px")}},next:function(){this.tail!==null&&!this.inTail?this.scrollTail(false):this.scroll((this.options.wrap=="both"||this.options.wrap=="last")&&this.options.size!==null&&this.last==this.options.size?1:this.first+this.options.scroll)},prev:function(){this.tail!==null&&this.inTail?this.scrollTail(true):this.scroll((this.options.wrap=="both"||this.options.wrap=="first")&&this.options.size!==null&&this.first==1?this.options.size:this.first-this.options.scroll)},scrollTail:function(a){if(!(this.locked|| this.animating||!this.tail)){this.pauseAuto();var c=h.intval(this.list.css(this.lt));c=!a?c-this.tail:c+this.tail;this.inTail=!a;this.prevFirst=this.first;this.prevLast=this.last;this.animate(c)}},scroll:function(a,c){if(!(this.locked||this.animating)){this.pauseAuto();this.animate(this.pos(a),c)}},pos:function(a,c){var b=h.intval(this.list.css(this.lt));if(this.locked||this.animating)return b;if(this.options.wrap!="circular")a=a<1?1:this.options.size&&a>this.options.size?this.options.size:a;for(var d= this.first>a,f=this.options.wrap!="circular"&&this.first<=1?1:this.first,j=d?this.get(f):this.get(this.last),e=d?f:f-1,g=null,k=0,l=false,m=0;d?--e>=a:++e<a;){g=this.get(e);l=!g.length;if(g.length===0){g=this.create(e).addClass(this.className("jcarousel-item-placeholder"));j[d?"before":"after"](g);if(this.first!==null&&this.options.wrap=="circular"&&this.options.size!==null&&(e<=0||e>this.options.size)){j=this.get(this.index(e));if(j.length)g=this.add(e,j.clone(true))}}j=g;m=this.dimension(g);if(l)k+= m;if(this.first!==null&&(this.options.wrap=="circular"||e>=1&&(this.options.size===null||e<=this.options.size)))b=d?b+m:b-m}f=this.clipping();var p=[],o=0,n=0;j=this.get(a-1);for(e=a;++o;){g=this.get(e);l=!g.length;if(g.length===0){g=this.create(e).addClass(this.className("jcarousel-item-placeholder"));j.length===0?this.list.prepend(g):j[d?"before":"after"](g);if(this.first!==null&&this.options.wrap=="circular"&&this.options.size!==null&&(e<=0||e>this.options.size)){j=this.get(this.index(e));if(j.length)g= this.add(e,j.clone(true))}}j=g;m=this.dimension(g);if(m===0)throw Error("jCarousel: No width/height set for items. This will cause an infinite loop. Aborting...");if(this.options.wrap!="circular"&&this.options.size!==null&&e>this.options.size)p.push(g);else if(l)k+=m;n+=m;if(n>=f)break;e++}for(g=0;g<p.length;g++)p[g].remove();if(k>0){this.list.css(this.wh,this.dimension(this.list)+k+"px");if(d){b-=k;this.list.css(this.lt,h.intval(this.list.css(this.lt))-k+"px")}}k=a+o-1;if(this.options.wrap!="circular"&& this.options.size&&k>this.options.size)k=this.options.size;if(e>k){o=0;e=k;for(n=0;++o;){g=this.get(e--);if(!g.length)break;n+=this.dimension(g);if(n>=f)break}}e=k-o+1;if(this.options.wrap!="circular"&&e<1)e=1;if(this.inTail&&d){b+=this.tail;this.inTail=false}this.tail=null;if(this.options.wrap!="circular"&&k==this.options.size&&k-o+1>=1){d=h.margin(this.get(k),!this.options.vertical?"marginRight":"marginBottom");if(n-d>f)this.tail=n-f-d}if(c&&a===this.options.size&&this.tail){b-=this.tail;this.inTail= true}for(;a-- >e;)b+=this.dimension(this.get(a));this.prevFirst=this.first;this.prevLast=this.last;this.first=e;this.last=k;return b},animate:function(a,c){if(!(this.locked||this.animating)){this.animating=true;var b=this,d=function(){b.animating=false;a===0&&b.list.css(b.lt,0);if(!b.autoStopped&&(b.options.wrap=="circular"||b.options.wrap=="both"||b.options.wrap=="last"||b.options.size===null||b.last<b.options.size||b.last==b.options.size&&b.tail!==null&&!b.inTail))b.startAuto();b.buttons();b.notify("onAfterAnimation"); if(b.options.wrap=="circular"&&b.options.size!==null)for(var f=b.prevFirst;f<=b.prevLast;f++)if(f!==null&&!(f>=b.first&&f<=b.last)&&(f<1||f>b.options.size))b.remove(f)};this.notify("onBeforeAnimation");if(!this.options.animation||c===false){this.list.css(this.lt,a+"px");d()}else this.list.animate(!this.options.vertical?this.options.rtl?{right:a}:{left:a}:{top:a},this.options.animation,this.options.easing,d)}},startAuto:function(a){if(a!==undefined)this.options.auto=a;if(this.options.auto===0)return this.stopAuto(); if(this.timer===null){this.autoStopped=false;var c=this;this.timer=window.setTimeout(function(){c.next()},this.options.auto*1E3)}},stopAuto:function(){this.pauseAuto();this.autoStopped=true},pauseAuto:function(){if(this.timer!==null){window.clearTimeout(this.timer);this.timer=null}},buttons:function(a,c){if(a==null){a=!this.locked&&this.options.size!==0&&(this.options.wrap&&this.options.wrap!="first"||this.options.size===null||this.last<this.options.size);if(!this.locked&&(!this.options.wrap||this.options.wrap== "first")&&this.options.size!==null&&this.last>=this.options.size)a=this.tail!==null&&!this.inTail}if(c==null){c=!this.locked&&this.options.size!==0&&(this.options.wrap&&this.options.wrap!="last"||this.first>1);if(!this.locked&&(!this.options.wrap||this.options.wrap=="last")&&this.options.size!==null&&this.first==1)c=this.tail!==null&&this.inTail}var b=this;if(this.buttonNext.size()>0){this.buttonNext.unbind(this.options.buttonNextEvent+".jcarousel",this.funcNext);a&&this.buttonNext.bind(this.options.buttonNextEvent+ ".jcarousel",this.funcNext);this.buttonNext[a?"removeClass":"addClass"](this.className("jcarousel-next-disabled")).attr("disabled",a?false:true);this.options.buttonNextCallback!==null&&this.buttonNext.data("jcarouselstate")!=a&&this.buttonNext.each(function(){b.options.buttonNextCallback(b,this,a)}).data("jcarouselstate",a)}else this.options.buttonNextCallback!==null&&this.buttonNextState!=a&&this.options.buttonNextCallback(b,null,a);if(this.buttonPrev.size()>0){this.buttonPrev.unbind(this.options.buttonPrevEvent+ ".jcarousel",this.funcPrev);c&&this.buttonPrev.bind(this.options.buttonPrevEvent+".jcarousel",this.funcPrev);this.buttonPrev[c?"removeClass":"addClass"](this.className("jcarousel-prev-disabled")).attr("disabled",c?false:true);this.options.buttonPrevCallback!==null&&this.buttonPrev.data("jcarouselstate")!=c&&this.buttonPrev.each(function(){b.options.buttonPrevCallback(b,this,c)}).data("jcarouselstate",c)}else this.options.buttonPrevCallback!==null&&this.buttonPrevState!=c&&this.options.buttonPrevCallback(b, null,c);this.buttonNextState=a;this.buttonPrevState=c},notify:function(a){var c=this.prevFirst===null?"init":this.prevFirst<this.first?"next":"prev";this.callback("itemLoadCallback",a,c);if(this.prevFirst!==this.first){this.callback("itemFirstInCallback",a,c,this.first);this.callback("itemFirstOutCallback",a,c,this.prevFirst)}if(this.prevLast!==this.last){this.callback("itemLastInCallback",a,c,this.last);this.callback("itemLastOutCallback",a,c,this.prevLast)}this.callback("itemVisibleInCallback", a,c,this.first,this.last,this.prevFirst,this.prevLast);this.callback("itemVisibleOutCallback",a,c,this.prevFirst,this.prevLast,this.first,this.last)},callback:function(a,c,b,d,f,j,e){if(!(this.options[a]==null||typeof this.options[a]!="object"&&c!="onAfterAnimation")){var g=typeof this.options[a]=="object"?this.options[a][c]:this.options[a];if(i.isFunction(g)){var k=this;if(d===undefined)g(k,b,c);else if(f===undefined)this.get(d).each(function(){g(k,this,d,b,c)});else{a=function(m){k.get(m).each(function(){g(k, this,m,b,c)})};for(var l=d;l<=f;l++)l!==null&&!(l>=j&&l<=e)&&a(l)}}}},create:function(a){return this.format("<li></li>",a)},format:function(a,c){a=i(a);for(var b=a.get(0).className.split(" "),d=0;d<b.length;d++)b[d].indexOf("jcarousel-")!=-1&&a.removeClass(b[d]);a.addClass(this.className("jcarousel-item")).addClass(this.className("jcarousel-item-"+c)).css({"float":this.options.rtl?"right":"left","list-style":"none"}).attr("jcarouselindex",c);return a},className:function(a){return a+" "+a+(!this.options.vertical? "-horizontal":"-vertical")},dimension:function(a,c){var b=a.jquery!==undefined?a[0]:a,d=!this.options.vertical?(b.offsetWidth||h.intval(this.options.itemFallbackDimension))+h.margin(b,"marginLeft")+h.margin(b,"marginRight"):(b.offsetHeight||h.intval(this.options.itemFallbackDimension))+h.margin(b,"marginTop")+h.margin(b,"marginBottom");if(c==null||d==c)return d;d=!this.options.vertical?c-h.margin(b,"marginLeft")-h.margin(b,"marginRight"):c-h.margin(b,"marginTop")-h.margin(b,"marginBottom");i(b).css(this.wh, d+"px");return this.dimension(b)},clipping:function(){return!this.options.vertical?this.clip[0].offsetWidth-h.intval(this.clip.css("borderLeftWidth"))-h.intval(this.clip.css("borderRightWidth")):this.clip[0].offsetHeight-h.intval(this.clip.css("borderTopWidth"))-h.intval(this.clip.css("borderBottomWidth"))},index:function(a,c){if(c==null)c=this.options.size;return Math.round(((a-1)/c-Math.floor((a-1)/c))*c)+1}});h.extend({defaults:function(a){return i.extend(q,a||{})},margin:function(a,c){if(!a)return 0; var b=a.jquery!==undefined?a[0]:a;if(c=="marginRight"&&i.browser.safari){var d={display:"block","float":"none",width:"auto"},f,j;i.swap(b,d,function(){f=b.offsetWidth});d.marginRight=0;i.swap(b,d,function(){j=b.offsetWidth});return j-f}return h.intval(i.css(b,c))},intval:function(a){a=parseInt(a,10);return isNaN(a)?0:a}});i.fn.jcarousel=function(a){if(typeof a=="string"){var c=i(this).data("jcarousel"),b=Array.prototype.slice.call(arguments,1);return c[a].apply(c,b)}else return this.each(function(){i(this).data("jcarousel", new h(this,a))})}})(jQuery);


function parseXml(xml) {
   var dom = null;
   if (window.DOMParser) {
      try { 
         dom = (new DOMParser()).parseFromString(xml, "text/xml"); 
      } 
      catch (e) { dom = null; }
   }
   else if (window.ActiveXObject) {
      try {
         dom = new ActiveXObject('Microsoft.XMLDOM');
         dom.async = false;
         if (!dom.loadXML(xml)) // parse error ..
            window.alert(dom.parseError.reason + dom.parseError.srcText);
      } 
      catch (e) { dom = null; }
   }
   else
      alert("oops");
   return dom;
}



/*	This work is licensed under Creative Commons GNU LGPL License.

	License: http://creativecommons.org/licenses/LGPL/2.1/
   Version: 0.9
	Author:  Stefan Goessner/2006
	Web:     http://goessner.net/ 
*/
function xml3json(xml, tab) {
   var X = {
      toObj: function(xml) {
         var o = {};
         if (xml.nodeType==1) {   // element node ..
            if (xml.attributes.length)   // element with attributes  ..
               for (var i=0; i<xml.attributes.length; i++)
                  o["@"+xml.attributes[i].nodeName] = (xml.attributes[i].nodeValue||"").toString();
            if (xml.firstChild) { // element has child nodes ..
               var textChild=0, cdataChild=0, hasElementChild=false;
               for (var n=xml.firstChild; n; n=n.nextSibling) {
                  if (n.nodeType==1) hasElementChild = true;
                  else if (n.nodeType==3 && n.nodeValue.match(/[^ \f\n\r\t\v]/)) textChild++; // non-whitespace text
                  else if (n.nodeType==4) cdataChild++; // cdata section node
               }
               if (hasElementChild) {
                  if (textChild < 2 && cdataChild < 2) { // structured element with evtl. a single text or/and cdata node ..
                     X.removeWhite(xml);
                     for (var n=xml.firstChild; n; n=n.nextSibling) {
                        if (n.nodeType == 3)  // text node
                           o["#text"] = X.escape(n.nodeValue);
                        else if (n.nodeType == 4)  // cdata node
                           o["#cdata"] = X.escape(n.nodeValue);
                        else if (o[n.nodeName]) {  // multiple occurence of element ..
                           if (o[n.nodeName] instanceof Array)
                              o[n.nodeName][o[n.nodeName].length] = X.toObj(n);
                           else
                              o[n.nodeName] = [o[n.nodeName], X.toObj(n)];
                        }
                        else  // first occurence of element..
                           o[n.nodeName] = X.toObj(n);
                     }
                  }
                  else { // mixed content
                     if (!xml.attributes.length)
                        o = X.escape(X.innerXml(xml));
                     else
                        o["#text"] = X.escape(X.innerXml(xml));
                  }
               }
               else if (textChild) { // pure text
                  if (!xml.attributes.length)
                     o = X.escape(X.innerXml(xml));
                  else
                     o["#text"] = X.escape(X.innerXml(xml));
               }
               else if (cdataChild) { // cdata
                  if (cdataChild > 1)
                     o = X.escape(X.innerXml(xml));
                  else
                     for (var n=xml.firstChild; n; n=n.nextSibling)
                        o["#cdata"] = X.escape(n.nodeValue);
               }
            }
            if (!xml.attributes.length && !xml.firstChild) o = null;
         }
         else if (xml.nodeType==9) { // document.node
            o = X.toObj(xml.documentElement);
         }
         else
         {
         	//   alert("unhandled node type: " + xml.nodeType);
         }
         return o;
      },
      toJson: function(o, name, ind) {
         var json = name ? ("\""+name+"\"") : "";
         if (o instanceof Array) {
            for (var i=0,n=o.length; i<n; i++)
               o[i] = X.toJson(o[i], "", ind+"\t");
            json += (name?":[":"[") + (o.length > 1 ? ("\n"+ind+"\t"+o.join(",\n"+ind+"\t")+"\n"+ind) : o.join("")) + "]";
         }
         else if (o == null)
            json += (name&&":") + "null";
         else if (typeof(o) == "object") {
            var arr = [];
            for (var m in o)
               arr[arr.length] = X.toJson(o[m], m, ind+"\t");
            json += (name?":{":"{") + (arr.length > 1 ? ("\n"+ind+"\t"+arr.join(",\n"+ind+"\t")+"\n"+ind) : arr.join("")) + "}";
         }
         else if (typeof(o) == "string")
            json += (name&&":") + "\"" + o.toString() + "\"";
         else
            json += (name&&":") + o.toString();
         return json;
      },
      innerXml: function(node) {
         var s = ""
         if ("innerHTML" in node)
            s = node.innerHTML;
         else {
            var asXml = function(n) {
               var s = "";
               if (n.nodeType == 1) {
                  s += "<" + n.nodeName;
                  for (var i=0; i<n.attributes.length;i++)
                     s += " " + n.attributes[i].nodeName + "=\"" + (n.attributes[i].nodeValue||"").toString() + "\"";
                  if (n.firstChild) {
                     s += ">";
                     for (var c=n.firstChild; c; c=c.nextSibling)
                        s += asXml(c);
                     s += "</"+n.nodeName+">";
                  }
                  else
                     s += "/>";
               }
               else if (n.nodeType == 3)
                  s += n.nodeValue;
               else if (n.nodeType == 4)
                  s += "<![CDATA[" + n.nodeValue + "]]>";
               return s;
            };
            for (var c=node.firstChild; c; c=c.nextSibling)
               s += asXml(c);
         }
         return s;
      },
      escape: function(txt) {
         return txt.replace(/[\\]/g, "\\\\")
                   .replace(/[\"]/g, '\\"')
                   .replace(/[\n]/g, '\\n')
                   .replace(/[\r]/g, '\\r');
      },
      removeWhite: function(e) {
         e.normalize();
         for (var n = e.firstChild; n; ) {
            if (n.nodeType == 3) {  // text node
               if (!n.nodeValue.match(/[^ \f\n\r\t\v]/)) { // pure whitespace text node
                  var nxt = n.nextSibling;
                  e.removeChild(n);
                  n = nxt;
               }
               else
                  n = n.nextSibling;
            }
            else if (n.nodeType == 1) {  // element node
               X.removeWhite(n);
               n = n.nextSibling;
            }
            else                      // any other node
               n = n.nextSibling;
         }
         return e;
      }
   };
   if (xml.nodeType == 9) // document node
      xml = xml.documentElement;
   var json = X.toJson(X.toObj(X.removeWhite(xml)), xml.nodeName, "\t");
   return "{\n" + tab + (tab ? json.replace(/\t/g, tab) : json.replace(/\t|\n/g, "")) + "\n}";
}



$.extend({
  jYoutube: function( url, size ){
    if(url === null){ return ""; }

    size = (size === null) ? "big" : size;
    var vid;
    var results;

    results = url.match("[\\?&]v=([^&#]*)");

    vid = ( results === null ) ? url : results[1];

    if(size == "small"){
      return "http://img.youtube.com/vi/"+vid+"/2.jpg";
    }else {
      return "http://img.youtube.com/vi/"+vid+"/0.jpg";
    }
  }
});
changeTop10 = function(obj)
{
	var top = $(obj).parents("div.top3");
	top.find(".img").html( $("<img>").attr("src", $(obj).find("img").attr("src") ) );
	top.find("li.active").each(
		function()
		{$(this).removeClass("active")}
	)
	$(obj).addClass("active");	
}

jQuery.fn.reverse = function() {
    return this.pushStack(this.get().reverse(), arguments);
};

rss = function( url , div)
{
	this.url =  "";
	this.data  = null;
	this.div = "";
	this.load = function(url, div)
	{
		this.url = url;
		this.div = div;
		/*
		$("#"+data.container[i].widget.id).load( 
					 "/get_url?url=" + this.url,					
					function(data){ $(this).replaceWith(data); }
		);	
		*/		
		$(div).load( sitepath+"/get_url?url=" + this.url , 
			function(data)
			{
				if (data == "" )
				{
					$(this).html("Kan ikke laste siden");	
				}else
				{				
					$(this).html("Tenker...");	
					data = eval( "(" + xml3json( parseXml(data) , "  ") + ")");
					if (data != null)
					{
						if ( data.rss != null )
						{			
							var sz = new EJS({url: sitepath+'/resources/ejs/renderRSS'}).render(data);		
							$(this).html(sz);	
						}else if (data.channel != null)
						{
							alert("ATOM");
						}
					}
					rss.open = data;	
				}
			}	
		);
	}
	
	this.load(url , div);	
}

rss.open = null;
rss.render = function(data)
{	
	data = xml2json.parser(data);
	if (data != null)
	{
		if ( data.rss != null )
		{			
			var sz = new EJS({url: '/resources/ejs/renderRSS'}).render(data);		
		
		}else if (data.channel != null)
		{
			alert("ATOM");
		}
	}
	rss.open = data;	
}


createme = function(sz , szlogin)
{
	if ($("input[name='email']").val().length == 0)
	{
		return;
	}
	
	if ($("input[name='password']").val().length != 0 && $("input[name='password']").val() != $("input[name='repassword']").val())
	{
		return;
	}
	
	$("#register").hide();
	$("#loginsend").fadeIn().html('Sender din registrering..').removeClass();
	
	var s = $("form[name='create']").serialize() ;
	$.ajax({
		url:sz ,
		type : 'POST', 
		data:$("form[name='create']").serialize(), 
		success: function(data)
		{
			if (data.indexOf('@created') != -1)
			{
				$("input[name='__ac_name']").val($("input[name='email']").val()); 
				$("input[name='__ac_password']").val($("input[name='password']").val()); 
				loginme(szlogin);
			}else
			{
				$("#register").show();
				if (data.indexOf('@existing') != -1)
				{
					$("#loginsend").html('Du er allerede registrert som bruker, prøv å logge deg inn.').addClass('halfwrong');		
				}else
				{
					$("#loginsend").html('Feil vid registering.').addClass('wrong');	
				}
				
			}
		},
		error:function(data)
		{
			$("#register").show();
			alert('Feil vid registrering');
		}
	});
}


changemy = function(sz)
{
	$("#resetpassword").hide();
	$("#loginsend").fadeIn().html('Byter passord..').removeClass();
	$.ajax({
		url:sz , 
		data:$("form[name='reset']").serialize() , 
		type:'POST',
		success: function(data)
		{
			if ($.trim(data) == '1')
			{
				$("#loginsend").fadeIn().html('Bytt passord, nytt sent til din registret mail adress.').removeClass();
			}else
			{
				$("#resetpassword").show();
				$("#loginsend").html('Feil brukernavn eller feil ej registrert bruker. ').addClass('wrong');	
			}
		},
		error:function(data)
		{
			$("#resetpassword").show();
			$("#loginsend").html('Feil brukernavn eller feil ej registrert bruker. ').addClass('wrong');	
		}
	});

}


loginme = function(sz)
{
	$("#register").hide();
	$("#loginsend").fadeIn().html('Logger in...').removeClass();
	$.ajax({
		url:sz , 
		data:$("form[name='login']").serialize() , 
		type:'POST',
		success: function(data)
		{
			window.location= $("form[name='login']").find("input[name='came_from']").val();
		},
		error:function(data)
		{
			$("#register").show();
			$("#loginsend").html('Feil passord eller brukernavn.').addClass('wrong');	
		}
	});
}

rss.open = null;
rss.render = function(data)
{	
	data = xml2json.parser(data);
	if (data != null)
	{
		if ( data.rss != null )
		{			
			var sz = new EJS({url: '/resources/ejs/renderRSS'}).render(data);		
		
		}else if (data.channel != null)
		{
			alert("ATOM");
		}
	}
	rss.open = data;	
}



var shoppingCart = {
  version: 1.0,
  path : '',
  errorMsgs: {
    'forceField': 'Feltet m\xe5 fylles ut',
    'tooLongPostNo': 'Postnr m\xe5 v\xe6re 4 siffer',
    'placeNotFound': 'Fant ikke postnr',
  },

  __init__ : function() 
  {
    // Various init scripts that set up the page
    this.updateCart(true);

    // Add some event listeners
    $("button.cartAdd").bind('click', function() { cart.addToCart($(this), 1, 'add', true); });
    $("button.plus").live('click', function() { cart.addToCart($(this), 1); });
    $("button.minus").live('click', function() { cart.addToCart($(this), -1); });
    $("button.shoppingCartRemove").live('click', function() { cart.removeFromCart($(this)); });
    $("button.savedCartToCart").bind('click', function() { cart.savedCartToCart($(this)); });
    $("img#shoppingCartExpand").live('click', function() { cart.toggleCartExpand(); });
    $("a.viewDetails").bind('click', function() { return cart.toggleOrderDetails($(this)); });
    this.setUpAddressForm();

    // Bind button
    this.setNextStep();

    // Buttons that take you somewhere. Should they be regular links?
    $("#goToCart").live('click', function() { //document.location='/cart'; 
    	window.location = sitepath + '/cart'
    });
    $("#keepShopping").live('click', function() { history.back(); });

    return this;
  },

  savedCartToCart : function(ob) {
    var orderId=ob.val();
    $.post(sitepath+'/LimeShopping/orderToShoppingCart',{'order_id:int':orderId,'ajax:int':1}, function() {
      cart.updateCart();
    });
  },

  toggleOrderDetails : function(ob) {
    var details = $("#details"+ob.attr('id')).eq(0);
    if (details.is(":hidden")) {
      details.slideDown('normal', function() {
        ob.html('Skjul detaljer');
      });
    }
    else {
      details.slideUp('normal', function() {
        ob.html('Vis detaljer');
      });
    }
    return false;
  },

  addErrorMsg : function(field,type) {
    var errorBox = field.siblings(".errorMsg");
    if (!errorBox.length) {
      field.after('<span class="errorMsg"></span>');
      errorBox = field.siblings(".errorMsg");
    }
    errorBox.html(this.errorMsgs[type]);
    field.addClass('error');

  },
  removeErrorMsg : function(field) {
    field.siblings(".errorMsg").remove();
    field.removeClass('error');
  },

  validateAddressForm : function(form) {
    var errorFields=[];
    var forceFields_ = form.find("input[name^='force_fields']");
    var forceFields=[];
    forceFields_.each(function() {
      var field = $("[name*='" + $(this).val() + "']:enabled");
      if (field.length && field.attr('type')=='hidden') field=field.siblings("[name^='dis_" + $(this).val() + "']:disabled");
      if (field.length) forceFields.push(field);
    });

    jQuery.each(forceFields,function() {
      if (this.val().trim()=='') {
        errorFields.push(this);
        cart.addErrorMsg(this,'forceField');
      }
      else cart.removeErrorMsg(this);
    });

    if (errorFields.length) return false;
    return true;
  },

  setUpAddressForm : function() 
  {
    var addressForm = $("#addressForm form");
    if (!addressForm.length) return;

    // Bind the submit event
    addressForm.bind('submit', function() { return cart.validateAddressForm($(this)); } );

    // 
    // $("input[name*='postalnumber']").bind('keyup', function() { cart.findPostPlace($(this)); } );

    // Listen to country selector, disable/enable auto look up
    var countryFields=$("[name*='country']");

    countryFields.bind('change', function() {
      var cityField=$("input[name^='delivery_city']");
      var postField=$("input[name^='delivery_postalnumber']");
      if ($(this).attr('name').indexOf('invoice')>=0) {
        cityField=$("input[name^='invoice_city']");
        postField=$("input[name^='invoice_postalnumber']");
      }
      var value=$(this).val();
      // Norway, enable auto look up
      if (value=='1') {
        postField.bind('keyup',function() { cart.findPostPlace($(this)); } );
        cityField.attr('disabled','disabled');
      }
      // Other country, disable auto look up
      else {
        postField.unbind('keyup');
        cityField.removeAttr('disabled');
      }
    });

    countryFields.each(function() { $(this).trigger('change'); });

    var invoiceAsDeliveryCheck = addressForm.find("input[name^='set_invoice_same_as_delivery']");
    invoiceAsDeliveryCheck.bind('change', function() {
      var invoiceFields = $("[name^='invoice']");
      if (this.checked) invoiceFields.attr('disabled','disabled').removeClass('error');
      else invoiceFields.removeAttr('disabled');
      countryFields.each(function() { $(this).trigger('change'); });
    });
    invoiceAsDeliveryCheck.trigger('change');
  },

  findPostPlace : function(field) {
    var cityFields = $("input[name*='city']");
    var value=field.val().trim().replace(/\D/g,'');
    field.val(value);
    if (value.length<4) return;
    else if (value.length>4) {
      this.addErrorMsg(field,'tooLongPostNo');
      return;
    }
    else {
      this.removeErrorMsg(field);
    }
    var fieldName=field.attr('name');
    if (!cityFields.length) return;
    if (!value) return;

    $.get(sitepath+'/LimeShopping/getCityFromPostCode?post_code=' + value + '&return_id:int=1', function(data) { 
      var city='';
      var codeId=null;
      if (data) 
      {
        data=eval('('+data+')');
        city=data.place;
        codeId=data.id;
      }
      var cityFields = $("input[name*='delivery_city']");
      var codeIdField = $("input[name^='delivery_post_code_id']");
      if (fieldName.indexOf('invoice')>=0) {
        cityFields = $("input[name*='invoice_city']");
        codeIdField = $("input[name^='invoice_post_code_id']");
      }
      if (codeId) codeIdField.val(codeId);
      cityFields.each(function() {
         var field=$(this);
         field.val(city);
         if (field.attr('type')=='text') {
           if (!data) cart.addErrorMsg(field,'placeNotFound');
           else cart.removeErrorMsg(field);
         }
      });
      
    });

  },

  setNextStep : function() {
    var nextButton = $("#nextStep");
    if (!nextButton.length) return;
    nextButton.live('click', function() { document.location=$(this).val(); });
  },

  removeFromCart : function(button) {
    this.addToCart(button, 0, 'set');
  },

  updateCart : function(init) {
    var loc=''+document.location;
    var cartOb=[];
    var url;
    if (loc.indexOf('cart')==-1) {
      cartOb = $("#shoppingCart");
      url = sitepath+'/shoppingCartRightRender';
    }
    else if (!init) {
      cartOb = $("#shoppingCartFull");
      url = sitepath+'/shoppingCartRender';
    }

    if (cartOb.length != 0 && url != "") 
    {
      this.dim($(".shoppingCartDim"), cartOb, function(ob,sizeOb) {
        var cartOb = sizeOb;

        cartOb.load(url, {post:'true'}, function(responseText) {
          if (responseText=='-1') $(this).html('En feil oppsto ved lasting av handlekurven. Vennligst pr&oslash;v igjen senere.');
          cart.unDim($(".shoppingCartDim"));
        });
      });
    }

  },

  addToCart : function(button, count, mode, animate) {
    var isbn=button.val();
    if (count==null) count = 1;
    if (!mode) mode='add';
	if (animate) {
    	if ( button.parents('.book').length != 0 )
    	{
			button.parents('.book').effect('transfer',{to: "#cartTotal", className: 'transfer' },700);
    	}else if(button.parents('.bookwrapper').length != 0)
    	{
			button.parents('.bookwrapper').effect('transfer',{to: "#cartTotal", className: 'transfer' },700);    	
    	}      
    }
    $.post(sitepath+'/shoppingCartAdd',{'isbn:int':isbn, 'count:int':count, 'mode':mode }, function() { cart.updateCart(); } );
  },
  
  toggleCartExpand : function() {
    var cartObject=$(".shoppingCartItems");
    if (cartObject.is(':hidden')) {
      cartObject.slideDown('slow');
    }
    else {
      cartObject.slideUp('slow');
    }
  },

  dim : function(ob, sizeOb, callback) {
    if (sizeOb) {
      ob.height(sizeOb.height());
      ob.width(sizeOb.width());
    }
    ob.show();
    if (callback) callback(ob, sizeOb);
  },

  unDim : function(ob, callback) {
    ob.hide();
    if (callback) callback(ob);
  },


}

String.prototype.trim = function() {
  return this.replace(/^\s*|\s*$/g, "");
}
String.prototype.isInteger = function() {
 if (this.isEmpty())
 if (this.isInteger.arguments.length == 1) return 0;
 else return (this.isInteger.arguments[1] == true);
 for (var i = 0; i < this.length; i++) {
   var c = this.charAt(i);
   if (!c.isDigit()) return false;
 }
 return true;
}
String.prototype.isEmpty = function() {
  return ((this == null) || (this.length == 0))
}
String.prototype.isDigit = function() {
  return ((this >= "0") && (this <= "9"))
}

// Global variables
var system = { show_debug: true, userlevel: 100 };
var cart;
var ord;

$(document).ready(function()
{
  cart=shoppingCart.__init__();
  ord=ordObject.__init__();
  // set up the global debugger
  //Debug.init({opened: true});

});


$(document).ready(
	function()
	{
		$(".top10 .top3 li.active").reverse().each(
			function()
			{
				changeTop10( this );
			}
		);
		
		$(".youtubevideo").each(
			function()
			{
				uitem = $.trim($(this).html());
				if (uitem.length != 0)
				{
					$(this).html(
						$("<a/>").attr('href',uitem).attr('target','_blank').html($("<img/>").attr('border','0').attr("src" ,  ($.jYoutube( uitem  , 'large'))))
					)
				}
			}
		);		
		
		$(".rss").each(
			function()
			{
				rssitem = $.trim($(this).show().html());
				new rss( rssitem , $(this) );
			}
		)
	}
)

