function AndStore(options) {
    if (!options)
        options={};

    this.batchScript=options.batchScript;
    this.imageBase=options.imageBase;
    this.attachBase=options.attachBase;
    this.pageSize=options.pageSize;
    this.state={};
    this.strings=options.strings;
    this.itemDecorator=options.itemDecorator;

}

//use own find position because mootools is bugged in IE
//when in a scrolled region
AndStore.prototype.findPosition=function(obj) {

    var curleft = curtop = 0;

    if (obj.offsetParent) {
	curleft = obj.offsetLeft
	curtop = obj.offsetTop
	while (obj = obj.offsetParent) {
	    curleft += obj.offsetLeft
	    curtop += obj.offsetTop
	}
    }
    
    return {x:curleft,y:curtop};
}

AndStore.prototype.inCache=function(cacheKey) {
    var pos;
    pos=cacheKey.indexOf('?');
    if (pos!=-1) {
        cacheKey=cacheKey.substring(pos+1);
    }

    return AndStore.cache.has(cacheKey);
}

AndStore.prototype.CacheRequest=new Class({
    "Extends": Request.JSON ,
    "initialize":function(options) {
        this.parent(options);
    },
    "send":function(options) {
        neverCache=this.options.neverCache;
        this.cacheKey=this.options.url;
        var pos;
        pos=this.cacheKey.indexOf('?');
        if (pos!=-1) {
            this.cacheKey=this.cacheKey.substring(pos+1);
        }
        
        if (options && options.data) {
            if (options.data.search) {
                this.cacheKey+=options.data.search;
            } else {
                neverCache=true;
            }

        }


        if (this.options && !neverCache) {
            if (!AndStore.cache)
                AndStore.cache=new Hash;

            if (AndStore.cache.has(this.cacheKey)) {

                r=AndStore.cache.get(this.cacheKey);

                this.fireEvent('complete',[r]);

                return;
            }
        }
        this.parent(options);
    },

    "success":function(text) {
        this.parent(text);
        if (this.options && !this.options.neverCache) {
            AndStore.cache.set(this.cacheKey,this.response.json);
        }

    }
});


AndStore.prototype.preload=function(key,data) {
    if (!AndStore.cache)
        AndStore.cache=new Hash;
    AndStore.cache.set(key,data);
}

AndStore.prototype.init=function (itemid) {
    $('detail-template').setStyle('display','none');

    if ($('categories'))
        this.initCategories();

    if ($('artists'))
        this.initArtists();

    if ($('searchbox'))
        this.initSearch();

    var storeObj=this;

    var updatefunc=function(tab,state) {
        var page;
        if (state)
            page=state.page;
        else page=undefined;
        
        storeObj.updateResults(tab,page,state);
    }
    
    this.tab_handlers={
        "popular":updatefunc,
        "newest":updatefunc,
        "category":function(tab,state) {
            if (state && state.category)
                storeObj.clickCategory(state.category,state.page);
            if (!state || !state.category)
                storeObj.makeBookmark({"tab":tab});
        },
        "artist":function(tab,state) {
            if (state && state.uid)
                storeObj.clickArtist(state.uid,state.page);
            if (!state || !state.uid)
                storeObj.makeBookmark({"tab":tab});
        },
        "search2":function(tab,state) {
            if (state) {
                if (state.itemid) {
                    storeObj.loadid(state.itemid,state.page);
                } else if (state.search) {
                    $('searchbox').value=state.search;
                    $('searchbox').select();
                    storeObj.search(state.search,state.page);
                }
            }
            if (!state || !state.search)
                storeObj.makeBookmark({"tab":tab});
        },
        "item":function(tab,state) {
            storeObj.loaditem(state.itemid,state.page);
        }
        
    }

    if (itemid && window.location.hash.length==0)
        this.displayitem(itemid);
    else
        this.changeTab();
}

AndStore.prototype.changeTab=function(tab,state) {
    var tabs=['popular','newest','category','search2','artist'];
    var i;
    var decode;
    var bm;
    var init=false;


    if ($('individual')) {
        $('individual').setStyle('display','none');
    }
    if ($('browser')) {
        $('browser').setStyle('display','block');
    }

    if (!tab) {
        init=true;
        decode=this.decodeHash();
        if (!decode.tab) {
            tab='popular';
        } else {
            tab=decode.tab;
        }
    } else {
        if (state) {
            decode=state;
        } else {
            if (this.state[tab]) {
                decode=this.state[tab].bookmark;
            } else {
                decode={"tab":tab};
            }
        }
    }

    for (i=0;i<tabs.length;++i) {
        if (tab==tabs[i]) {
            $(tab+'tab').addClass('active');
            $(tab).setStyle('display','block');
            
            this.tab_handlers[tabs[i]](tabs[i],decode);
            
        } else {
            $(tabs[i]+'tab').removeClass('active');
            $(tabs[i]).setStyle('display','none');
        }
    }


    /*if (init) {
        this.makeBookmark({"tab":tab});

    } */

    if (decode.itemid) {
        $('individual').setStyle('display','block');
        $('browser').setStyle('display','none');
        this.displayitem(decode.itemid);
    }
}

AndStore.prototype.initCategories=function() {
    var storeObj=this;

    this.showWait($('categories'));
    new this.CacheRequest( {'url':this.batchScript+'?getcategories=1',
                'onComplete':function(results) {
                    $('categories').empty();
                    var index=0;
                    results.each(function(e) {
                        var el=new Element('div').addClass('category-list');
                        if (index%2==0)
                            el.addClass('even');
                        else el.addClass('odd');
                        el.set('text',e['name']+' ('+e['count']+')').setStyle('cursor','pointer');
                        el.addEvent('click',function() {
                                storeObj.clickCategory(e['catid']);});
                        el.inject($('categories'));
                        ++index;
                    });
            }}).send();    
}

AndStore.prototype.initArtists=function() {
    var storeObj=this;

    this.showWait($('artists'));
    new this.CacheRequest( {'url':this.batchScript+'?getartists=1',
                'onComplete':function(results) {
                    $('artists').empty();
                    var index=0;
                    results.each(function(e) {
                        var el=new Element('div').addClass('artist-list');
                        if (index%2==0)
                            el.addClass('even');
                        else el.addClass('odd');
                        el.set('text',e['spacename']+' ('+e['count']+')').setStyle('cursor','pointer');
                        el.addEvent('click',function() {
                                storeObj.clickArtist(e['uid']);});
                        el.inject($('artists'));
                        ++index;
                    });
            }}).send();    
}

AndStore.prototype.initSearch=function() {
    var storeObj=this;

    $('searchbox').select();
    storeObj.completer=new Autocompleter.Ajax.Json($('searchbox'),
                                              this.batchScript+'?autocomplete=1',
    {
        'postVar': 'search',
            'delay': '100',
            'minLength':3,
            'selectMode': false,
            'onSelection':function(input,highlight,curVal,nextVal) {
            this.observer.pause();
            input.value=nextVal['subject'];
            this.observer.resume();
                storeObj.search(nextVal['subject'],0);
        },
            'injectChoice':function(choice) {
            
            //dropdown menu
            var el = new Element('li')
                .set('html',this.markQueryValue(choice['subject']));
            el.inputValue = choice;
            el.inputValue.substr=function(a,b) { return choice['subject'].substr(a,b);}
            
            this.addChoiceEvents(el).injectInside(this.choices);
        }
    });

    storeObj.completer.query2=storeObj.completer.query;
    
    storeObj.completer.query=function() {
        storeObj.clearResults('search2');
        this.query2();
    }

    $('searchbox').addEvent('keydown',function(evt) {
            if (evt.code==13) {
                if (!storeObj.completer.selected) {
                    storeObj.completer.hideChoices();
                    storeObj.search($('searchbox').value,0);
                }
            }
        });
    

}

AndStore.prototype.clickCategory=function(catid,page) {
    var state={"tab":"category","category":catid};
    this.makeBookmark(state);
    var storeObj=this;
    $('categories').setStyle('display','none');

    $('category-container').setStyle('display','block');
    if (!this.inCache('category='+catid)) {
        $('category-container').empty();
        this.showWait($('category-container'));
    }

    new this.CacheRequest({ 'url' : this.batchScript+'?category='+catid,
                            'onComplete' : function(results2) {
                                var myobj=$('category-container').clone();
                                myobj.empty();
                                
                                
                                var el2=new Element('div').addClass('category-back odd');
                                el2.set('html','<a>&lt; '+storeObj.strings.categories+' | '+results2.catname+'</a>').addEvent('click',function() {
                                    
                                    $('categories').setStyle('display','block');
                                    myobj.setStyle('display','none');
                                    storeObj.makeBookmark({"tab":"category"});
                                });
                                el2.inject(myobj);
                                var resultContainer=new Element('div').inject(myobj);
                                
                                storeObj.results=results2;
                                storeObj.displayResults(resultContainer,page,state);
                                myobj.replaces($('category-container'));
                                myobj.setProperty('id','category-container');
                            }}).send();
}


AndStore.prototype.clickArtist=function(uid,page) {
    var state={"tab":"artist","uid":uid};
    this.makeBookmark(state);
    var storeObj=this;

    if (!this.inCache(this.batchScript+'?uid='+uid)) {
        $('artist-container').empty();
        this.showWait($('artist-container'));
    }

    $('artist-container').setStyle('display','block');
    $('artists').setStyle('display','none');

    new this.CacheRequest({ 'url' : this.batchScript+'?uid='+uid,
                            'onComplete' : function(results2) {
                                var myobj=$('artist-container').clone();
                                myobj.empty();
                                var el2=new Element('div').addClass('artist-back odd');
                                el2.set('html','<a>&lt; '+storeObj.strings.artists+' | '+results2.spacename+'</a>').addEvent('click',function() {
                                    
                                    $('artists').setStyle('display','block');
                                    $('artist-container').setStyle('display','none');
                                    storeObj.makeBookmark({"tab":"artist"});
                                });
                                el2.inject(myobj);
                                var resultContainer=new Element('div').inject(myobj);
                                
                                storeObj.results=results2;
                                storeObj.displayResults(resultContainer,page,state);
                                myobj.replaces($('artist-container'));
                                myobj.setProperty('id','artist-container');
                            }}).send();
}

AndStore.prototype.fillItemDetailSummary=function(detailElement,itemdata,fromrelated,imageloadfunc) {
    var storeObj=this;

    if (!fromrelated) {
        detailElement.getElements('.navbar').addEvent('click',function() {
            url=window.location.href.match(/[^#]*/);
            if (window.andstore_prevhash) {
                url+=window.andstore_prevhash;
            } else {
                url+='#t_popular';
            }

            window.location.replace(url);

            storeObj.changeTab();
            $('browser').setStyle('display','block');
            $('individual').setStyle('display','none');
            
        });
    }

    detailElement.getElements('.title').set('text',itemdata.subject);
    
    
    this.fillItemCommonData(detailElement,itemdata);

    

    detailElement.getElements('.gift_for').addEvent('blur',add_gift.bindWithEvent() );

    var imagesRegion=detailElement.getElements('.images')[0];
    var temp=detailElement.getElements('.imagethumb-template')[0];   
    

    imagesRegion.empty();

    //itemdata.images.push(itemdata.images[0]);
    //itemdata.images.push(itemdata.images[1]);
    //itemdata.images.push(itemdata.images[2]);

    var mainImage=detailElement.getElements('.detail-image');


    for (i=0;i<itemdata.images.length;++i) {
        var imgobj=temp.clone();
        imgobj.removeClass('imagethumb-template');
        if (i==0)
            imgobj.addClass('imageselected');

        imgobj.setStyle('display','block');
        imgobj.getElements('.imagethumb').each(function(el) {
            if (itemdata.images[i].thumbpath.indexOf(storeObj.attachBase)==-1)
                el.src=storeObj.attachBase+itemdata.images[i].thumbpath;
            else el.src=itemdata.images[i].thumbpath;
        });
        var imgpath=itemdata.images[i].filepath;



        imgobj.store('filepath',itemdata.images[i].filepath);

        imgobj.addEvent('click',function(param) {
            var img=this.retrieve('filepath');
            
            imagesRegion.getElements('div').removeClass('imageselected');            
            this.addClass('imageselected');

            detailElement.getElements('.detail-image').each(function(e2) {
                var src;
                if (img.indexOf(storeObj.attachBase)==-1)
                    src=storeObj.attachBase+img;
                else
                    src=img;
                storeObj.loadImageRescale(e2,src);
            });
        });
        imgobj.injectInside(imagesRegion);
    }


    var i=0;
    //there should only be one
    for (i=1;i<mainImage.length;++i) {
        mainImage[i].destroy();
    }
    mainImage.each(function(e) {
        if (imageloadfunc) {
            var thefunc=function() { 
                this.removeEvent('load',thefunc);
                imageloadfunc(); 
            }

            e.addEvent('load',thefunc);
        };

        storeObj.loadImageRescale(e,itemdata.image);
    });
    


}


AndStore.prototype.loadImageRescale=function(img,imgsrc) {
    var newimg=new Image;
    var storeObj=this;

    newimg.src=imgsrc;
    if (storeObj.current_load)
        clearTimeout(storeObj.current_load);

    var func=function() {
        if (newimg.complete) {
            if ($('imgwait')) {
                $('imgwait').destroy();
            }
            img.setStyle('visibility','hidden');
            img.src=imgsrc;
            storeObj.rescaleImg(img,newimg.width,newimg.height);
            img.setStyle('visibility','visible');
            storeObj.current_load=undefined;            
        } else {
            var parent=img.getParent();
            if (!$('imgwait') && parent) {
                storeObj.showWaitId(parent,'imgwait');
                var waitObj=parent.getElements('.wait')[0];
                if (waitObj) {
                    waitObj.setStyles({'position':'absolute',
                                            'left':parent.getPosition().x,
                                            'top':parent.getPosition().y,
                                            'width':parent.getSize().x});
                }
            }
            storeObj.current_load=setTimeout(func,500);
        }

    };

    func();
}

AndStore.prototype.rescaleImg=function(img,newWidth,newHeight) {
    var xscale,yscale;
    var maxx=parseInt(img.getParent().getStyle('width'));
    var maxy=parseInt(img.getParent().getStyle('height'));
    var clientWidth,clientHeight;

    if (newWidth) {
        clientWidth=newWidth;
        clientHeight=newHeight;
    } else {
        clientWidth=img.clientWidth;
        clientHeight=img.clientHeight;
    }
    xscale=maxx/clientWidth;
    yscale=maxy/clientHeight;
    if (yscale<xscale)
        xscale=yscale;
    if (xscale!=1) {
        img.style.width=Math.round(xscale*clientWidth)+'px';
        img.style.height=Math.round(xscale*clientHeight)+'px';
    } else if (xscale==1) {        
        img.style.width=maxx+'px';
        img.style.height=maxy+'px';
    } 
}

AndStore.prototype.fillItemDetailRelated=function(detailElement,relatedData) {

    var temp=detailElement.getElements('.related-template')[0];
    var imagesRegion=detailElement.getElements('.related')[0];

    var storeObj=this;

    imagesRegion.empty();

    for (i=0;i<relatedData.length;++i) {
        var imgobj=temp.clone();
        imgobj.removeClass('related-template');
        if (i==0)
            imgobj.addClass('relatedselected');

        imgobj.setStyle('display','block');
        imgobj.getElements('.imagethumbrelated').each(function(el) {
            el.store('thumb',relatedData[i].thumb);
            if (i<5)
                el.src=relatedData[i].thumb;
        });

        imgobj.store('itemid',relatedData[i].itemid);

        imgobj.addEvent('click',function() {
            var theobj=$(this);
            
            storeObj.makeBookmark({"itemid":this.retrieve('itemid')});

            var newel=theobj.getElements('.imagethumbrelated')[0];
            newel.clone().set('id','').injectAfter(newel);
            newel.setStyle('border','none');

            //newel.src=theobj.get('image');
            //newel.setProperty('src',this.get('relatedData').image);
            //var newel=new Element('img').setStyles({border: "1px solid black"});
            //newel.setProperty('src',this.src);
            
            //newel.setStyle('height',theobj.getSize().y);
            //newel.setStyle('width',theobj.getSize().x);
            
            var fx=new Fx.Morph(newel,{duration: "short"});
            var thumb=detailElement.getElements('.detail-image')[0].getParent();
            
            
            if (!thumb) return;

            newel.setStyle('position','absolute');
            var oldpos;
            if (!Browser.Engine.webkit)
                oldpos=storeObj.findPosition(newel);
            else oldpos=newel.getPosition();

            newel.setStyles({left:oldpos.x,top:oldpos.y});
            
            //newel.injectInside(document.body);
            var itemid=this.retrieve('itemid');
            
            fx.start({'left':[oldpos.x,thumb.getPosition().x],
                      'top':[oldpos.y,thumb.getPosition().y],
                      'height':[this.getSize().y,thumb.getSize().y],
                      'width':[this.getSize().x,thumb.getSize().x]}).chain(function() {
                          //newel.src=theobj.get('image');
                          imagesRegion.getElements('.relatedselected').each(function(e2) {
                              e2.removeClass('relatedselected');
                          });
                          theobj.addClass('relatedselected');
                          var waitElement=detailElement.getElements('.iteminfowait')[0];
                          var tableElement=detailElement.getElements('.iteminfotable')[0];
                          waitElement.empty();
                          storeObj.showWait(waitElement);
                          var altwait=detailElement.getElements('.images')[0];
                          altwait.empty();
                          new Element('img',{src:storeObj.imageBase+'icon_wait.gif'}).injectInside(altwait);

                          waitElement.setStyle('display','block');

                          tableElement.setStyle('display','none');

                          new storeObj.CacheRequest({'url':storeObj.batchScript+'?norelated=1&id='+itemid,
                                            'onComplete':function(result) {
                                                var itemdata=result.rows[0];
                                                if (result.images)
                                                    itemdata.images=result.images;
                                                if (!itemdata.images)
                                                    itemdata.images=[];
                                                if ((itemdata.images.length==0) || (itemdata.images[0].thumbpath!=itemdata.thumb)) {
                                                    itemdata.images.unshift({thumbpath:itemdata.thumb,filepath:itemdata.image});
                                                }
                                                storeObj.fillItemDetailSummary(detailElement,itemdata,true,function() {                                                newel.destroy();                                                });
                                                storeObj.fillItemDetailDescription(detailElement,itemdata);
                                                /*                                                    checkbuttons();
                                                    checkImgSelections();
*/

                                                waitElement.setStyle('display','none');
                                                tableElement.setStyle('display','block');
                                            }}).send();

                      });
        });

        
        imgobj.injectInside(imagesRegion);
    }


    this.updateArrows(detailElement);
    
}

AndStore.prototype.fillItemDetailDescription=function(detailElement,itemData) {
    detailElement.getElements('.description').each(function(e) {
        e.set('html',itemData.message);
    });
}

AndStore.prototype.displayitem=function(itemid) {
    window.scrollTo(0,0);
    $('browser').setStyle('display','none');
    $('individual').setStyle('display','block');
    window.andstore_prevhash=window.location.hash;



    this.makeBookmark({"itemid":itemid});
    var storeObj=this;

    $('individual').empty();

    this.showWait($('individual'));

    var storeObj=this;

    new this.CacheRequest({url:this.batchScript+'?id='+itemid,onComplete:function(result) {

        var obj=$('detail-template').clone().set('id','');

        $('individual').empty();

        var itemdata=result.rows[0];
        itemdata.images=result.images;
        if (!itemdata.images)
            itemdata.images=[];
        if ((itemdata.images.length==0) || (itemdata.images[0].thumbpath!=itemdata.thumb)) {
            itemdata.images.unshift({thumbpath:itemdata.thumb,filepath:itemdata.image});
        }
        

        storeObj.fillItemDetailSummary(obj,itemdata);
        storeObj.fillItemDetailRelated(obj,result.rows);
        storeObj.fillItemDetailDescription(obj,itemdata);

        obj.injectInside($('individual'));
        obj.setStyle('display','block');
        

    } }).send();

}

AndStore.prototype.fillItemCommonData=function(obj,choice) {
    var storeObj=this;
    var itemlist; //in case selection by class is an inefficient op

    itemlist=obj.getElements('.category');
    itemlist.each(function(e) {e.empty()});
    itemlist.adopt(new Element('a').set('text',choice['category']).addEvent('click',function() {
        storeObj.changeTab('category',{"tab":"category",
                                       "category":choice['catid']});
    }));
    itemlist=obj.getElements('.artist');
    itemlist.each(function(e) {e.empty()});
    itemlist.adopt(new Element('a').set('text',choice['spacename']).addEvent('click', function() {
        storeObj.changeTab('artist',{"uid":choice['uid']});
    }));
    obj.getElements('.price').set('text',choice['price']);
    obj.getElements('.usd').set('text',choice['usd']);
    obj.getElements('.monthprice').set('text',choice['monthprice']);
    obj.getElements('.monthusd').set('text',choice['monthusd']);

    obj.getElements('.amtlink').each(function(e) {
        var href=e.getProperty('href');
        href=href.replace('[amt]',choice['price']);
        href=href.replace('[monthamt]',choice['monthprice']);
        e.setProperty('href',href);
        e.addEvent('click',function() {
            var w; 
            w=window.open(href,'and_currency'); 
            if (w) w.focus();
            return false;
        });
    });
    if (choice['recurring_frequency']>1) {
        var el=obj.getElements('.pricerow');

        if (el.getlength>0)
            obj.getElements('.monthly').setStyle('display',el[0].getStyle('display'));
    }

    obj.getElements('.itemjump').addEvent('click',function() {
        storeObj.displayitem(choice['itemid']);
        //window.location=choice['url'];
    });

    itemlist=obj.getElements('.variants');
    itemlist.each(function(e) {e.empty()});
    itemlist.each(function(variants) {
        if (choice['skus']) {
            var first=true;
            var newel;
            
            choice['skus'].each(function(e) {
                
                newel=new Element('input',{"name":"skuid"+choice['itemid'],
                                           "id":"skuid"+choice['itemid'],
                                           "type":"radio",
                                           "value":e.skuid });
                newel.setStyles({paddingLeft:0,marginLeft:0});

                if (first) {
                    newel.setProperty('checked','checked');
                    if (Browser.Engine.trident)
                        newel.setProperty('defaultChecked','checked');
                    first=false;
                }

                newel.inject(variants);
                if (choice['skus'].length==1) {
                    newel.setStyle('visibility','hidden');
                    obj.getElements('.variantsrow').setStyle('display','none');
                } else {

                    new Element('labelfor').set('text',e['description']+' ').inject(variants);
                    new Element('wbr').inject(variants);
                    obj.getElements('.variantsrow').setStyle('display','block');
                }
            });
            if (choice['recurring_frequency']>0) {
                new Element('input',{'id':'sub_'+choice['itemid'],
                                     'type':'hidden',
                                     'name':'sub_'+choice['itemid'],
                                     'value':1}).inject(variants); 
            }
            
            new Element('br').inject(variants);
        }
    });

    obj.getElements('.giftarea').each(function(e) {
        if (choice['canbuy'])
            e.setStyle('display','block');
    });

    obj.getElements('.addCart').each(function(e) {
        if (choice['canbuy']) {
            e.removeEvents();
            e.addEvent('click',function() {
                store_add_to_cart(choice['itemid']);
            });
            e.setStyle('display','inline');
        } else e.setStyle('display','none');
    } );

}

AndStore.prototype.resultInsert=function(choice,index,insertObj,altTemplate) {
    var obj;

    if ($(altTemplate)) {
        obj=$(altTemplate).clone();
    } else {
        obj=$('item-template').clone();
    }

    obj.setProperty('id','');
    var storeObj=this;

    if (index==-1)
        index=this.countResults(insertObj);

    obj.getElements('.thumb').setProperty('src',choice['thumb']);


    //obj.getElements('.subject').set('html','<a href="'+choice['url']+'">'+choice['subject']+'</a>');
    obj.getElements('.subject').set('text',
                                    choice['subject'])
    .addEvent('click',
              function() {
                  storeObj.displayitem(choice['itemid']);
              });

    this.fillItemCommonData(obj,choice);

    obj.setStyle('display','block');
    if (this.itemDecorator) {
        this.itemDecorator(obj,choice,altTemplate,index);
    }
    obj.injectInside(insertObj);
}


AndStore.prototype.loadid=function(id,page) {

    var vals={"data":{"id":id}};

    this.makeBookmark({"tab":"search2","itemid":id});
    var storeObj=this;

    $('search2-results').empty();

    this.showWait($('search2-results'));
    new this.CacheRequest({url:this.batchScript,onComplete:function(result) {
        if (result) {
            $('searchbox').value=result['rows'][0].subject;
            $('searchbox').select();
        }
        
        storeObj.results=result;
        storeObj.displayResults($('search2-results'),page,{"tab":"search2",
                                                           "itemid":id
                                                          },'search-template');

    } }).send(vals);

}

AndStore.prototype.search=function(val,page) {
    var vals={"data":{"search":val}};

    this.makeBookmark({"tab":"search2","search":val});
    var storeObj=this;

    $('search2-results').empty();

    this.showWait($('search2-results'));
    new this.CacheRequest({url:this.batchScript,onComplete:function(result) {
        storeObj.results=result;
        //storeObj.clearResults('search2');
        storeObj.displayResults($('search2-results'),page,{"tab":"search2",
                                                           "search":val
                                                          },'search-template');

    } }).send(vals);
}

AndStore.prototype.showWait=function(container) {
    this.showWaitId(container,'');
}

AndStore.prototype.showWaitId=function(container,theid) {
    new Element('img',{src: this.imageBase+'icon_wait.gif'}).injectInside(
        new Element('div',{"id":theid}).addClass('wait')
        .injectInside(container));
}


AndStore.prototype.updateResults=function(tab,page,state) {
    this.showWait($(tab+'-results'));
    var storeObj=this;

    new this.CacheRequest({url:this.batchScript+'?type='+tab,
                           onComplete: function(results) {
                               storeObj.results=results;
                               storeObj.displayResults($(tab+'-results'),page,state);
                           }}).send();
}

AndStore.prototype.displayResults=function (container,page,state,altTemplate) {
    if (!page)
        page=0;

    if (state) {
        state.page=page;
        this.makeBookmark(state);
    }
    var origContainer=container;
    var origid=container.getProperty('id');

    container=container.clone();
    container.empty();

    this.insertPaginator(container,
                         this.results.rows.length,page,state,altTemplate);
    start=page?(page*this.pageSize):0;
    for ( var index=start; index<this.results.rows.length && 
         index-start<this.pageSize; ++index ) {
        var item = this.results.rows[index];
        this.resultInsert(item,index,container,altTemplate);
    }
    this.insertPaginator(container,this.results.rows.length,page,state,altTemplate);
    container.replaces(origContainer);
    container.setProperty('id',origid);
}

AndStore.prototype.insertPaginator=function(container,numItems,curPage,state,altTemplate) {
    var obj=$('paginator-template').clone().setProperty('id','');
    var storeObj=this;
    curPage=parseInt(curPage);

    var numPages=Math.floor(numItems/this.pageSize);
    
    if ((numPages)*this.pageSize<numItems)
        ++numPages;
    if (numPages>1) {
        obj.getElements('.back').each(function(e) {
            if (curPage>0) {
                e.addEvent('click',function() {
                    storeObj.displayResults(container,curPage-1,state,altTemplate);
                });
            } else e.setStyle('visibility','hidden');
        });
        
        obj.getElements('.next').each(function(e) {
        if (curPage+1<numPages) {
            e.addEvent('click',function() {
                storeObj.displayResults(container,curPage+1,state,altTemplate);
            });
        } else e.setStyle('visibility','hidden');
        });

        obj.getElements('.current').each(function(e) {
            e.set('html',curPage+1);
        });
        obj.getElements('.max').each(function(e) {
            e.set('html',numPages);
        });

        obj.setStyle('display','block').injectInside(container);
    } else if (numPages==0 && container.childNodes.length==0) {
        if ($('noresults')) {
            $('noresults').clone().set('id','').setStyle('display','block').injectInside(container);
        }
    }
}

AndStore.prototype.clearResults=function(tab) {
    $(tab+'-results').empty();
}

AndStore.prototype.countResults=function(element) {
    
    var start=element.childNodes;
    var count=0;
    var i;
    
    for (i=0;i<start.length;++i) {
        if ($type(start)=='element') {
            ++count;
        }
    }
    return count;
}


AndStore.prototype.makeBookmark=function(info) {
    var url;
    var bm='';
    for (var col in info) {
        if (col.substring(0,1)!='p' || info[col]!=0) {
            if (bm.length>0)
                bm+='+';
            
            bm+=col.substring(0,1)+'_'+info[col];
        }
    }

    url=window.location.href.match(/[^#]*#/);
    if (bm.length>0) {
        if (url) {
            window.location.replace(url+bm);
        } else {
            window.location.replace(window.location.href+'#'+bm);
        }
    } else {
        if (url)
            window.location.replace(url);
    }
    
    //save the state
    if (info && info.tab) {
        this.state[info.tab]={"bookmark":info                             
                             };
    }
}

AndStore.prototype.decodeHash=function(hash) {
    if (!hash)
        hash=window.location.hash;
    var parts=hash.substring(1).split('+',3);
    var nvp;
    var i;
    var retVal={};
    var lookup={
        "t":"tab",
        "c":"category",
        "s":"search",
        "p":"page",
        "i":"itemid",
        "u":"uid"
    };

    for (i=0;i<parts.length;++i) {
        nvp=parts[i].split('_',2);
        if (nvp.length>1) {
            if (lookup[nvp[0]]) {
                retVal[lookup[nvp[0]]]=AndStore.urldecode(nvp[1]);
            }
        }
    }
    return retVal;
}


AndStore.prototype.updateArrows=function(parent) {

    var related=parent.getElements('.related')[0];
    var storeObj=this;

    var width=0;

    related.getChildren().each(function(e) {
        width+=parseInt(e.getStyle('width'))+
            parseInt(e.getStyle('margin-right'));
    });
    related.setStyle('width',width);


    parent.getElements('.leftArrow').addEvent('mousedown',function() {
        var container=parent.getElements('.relatedContainer')[0];
        var fx=new Fx.Scroll(container,{duration: "short"}).chain(function() {
            storeObj.checkScroll(parent);
        });
        fx.start(container.getScroll().x-120*3);
    });

    parent.getElements('.rightArrow').addEvent('mousedown',function() {
        var container=parent.getElements('.relatedContainer')[0];
        var fx=new Fx.Scroll(container,{duration:"short"}).chain(function() {
            storeObj.checkScroll(parent);
        });

        fx.start(container.getScroll().x+120*3);
    });

    
    setTimeout(function() {storeObj.checkScroll(parent);},
             300);
}

AndStore.prototype.checkScroll=function(parent) {
    var obj=parent.getElements('.rightArrow')[0];
    var container=parent.getElements('.relatedContainer')[0];

    if (obj) {
        var spacer=parent.getElements('.related')[0];
        var width=container.getSize().x;
        if (width+container.scrollLeft>=spacer.getSize().x) {
            obj.addClass('rightArrowDisabled');
            
        } else {
            obj.removeClass('rightArrowDisabled');
        }
        if (container.scrollLeft<=0) {
            parent.getElements('.leftArrow').addClass('leftArrowDisabled');
        } else {
            parent.getElements('.leftArrow').removeClass('leftArrowDisabled');
        }
    }

    if (container && container.scrollLeft>0 && !container.retrieve('loadedall')) {
        container.getElements('.imagethumbrelated').each(function(e) {
            var thumb=e.retrieve('thumb');
            if (thumb && thumb.length>0 && e.src!=thumb) {
                e.src=thumb
            }
        });
        container.store('loadedall',true);
    }

    
}
AndStore.urldecode=function(str) {
    // http://kevin.vanzonneveld.net
    // +   original by: Philip Peterson
    var histogram = {};
    var ret = str.toString();
    
    var replacer = function(search, replace, str) {
        var tmp_arr = [];
        tmp_arr = str.split(search);
        return tmp_arr.join(replace);
    };
    
    // The histogram is identical to the one in urlencode.
    histogram["'"]   = '%27';
    histogram['(']   = '%28';
    histogram[')']   = '%29';
    histogram['*']   = '%2A';
    histogram['~']   = '%7E';
    histogram['!']   = '%21';
    histogram['%20'] = '+';
 
    for (replace in histogram) {
        search = histogram[replace]; // Switch order when decoding
        ret = replacer(search, replace, ret) // Custom replace. No regexing   
    }
    
    // End with decodeURIComponent, which most resembles PHP's encoding functions
    ret = decodeURIComponent(ret);
 
    return ret;

}
