horus.script.load('tooltip', 'select');
jpmaps.searchaction='/localaction/search.cfm';


jpmaps.getsub=
  function () {
    var mastercat=jpmaps.getsub.stockmaster.get();
    var stocksub=jpmaps.getsub.stocksub;
    stocksub.clear();
    var mapsfound=0;
    var first;

    for (var i=0; i<jpmaps.stocksub.length; i++) {
      var stockcat=jpmaps.stocksub[i];

      if (stockcat.mastercat==mastercat) {
	stocksub.insert([ stockcat.description, stockcat.id ]);
	if (!first) first=stockcat.description;
	mapsfound++;
      }
    }

    if (mapsfound>1) {
      stocksub.insert([ 'All maps in this section', 0 ], true, 0);
      stocksub.removeClass('hidden');
    } else
      stocksub.addClass('hidden');

  };


jpmaps.maptip=
  function ( event ) {
    event=new horus.event(event);
    var map=jpmaps.maps[event.toId()];
    var image=map.image;

    horus.tooltip
      (event,
       [ [ 'img', { src: '/mapimages/maplist/'+map.image, alt: map.title } ],
	 horus.BR, 'Click for more information' ]);

  };


jpmaps.fetchmap=
  function ( response ) {
    if (response.ajaxStatus(true)) {
      var matches=response.selectNodes('horus/map');

      for (var i=0; i<matches.length; i++) {
	var match=matches[i];
	var stockcode=response.getAttribute(match, 'stockcode');
	var collection=response.getAttribute(match, 'collection');
	var retail, retaildisplay;

	if (collection) {
	  retail=null;

	  retaildisplay=
	    [ 'span', null,
	      'Part of the collection "',
	      [ 'a', { href: '/map/id.'+collection },
		response.getAttribute(match, 'collectiontitle') ], '."' ];

	} else {
	  retail=response.getAttribute(match, 'retail');
	  retaildisplay=response.getAttribute(match, 'retaildisplay');
	}

	var map=jpmaps.maps[stockcode];

	if (map) {
	  map.retail=retail;
	  map.retaildisplay=retaildisplay;
	  horus.replaceContent('mapprice'+stockcode, map.retaildisplay);
	} else {
	  map=jpmaps.maps[stockcode]=
	    { node:          document.getElementById('map'+stockcode),
	      retail:        retail,
	      retaildisplay: retaildisplay };

	  map.collection=collection;
	  map.collectiontitle=response.getAttribute(match, 'collectiontitle');
	  map.year=response.getAttribute(match, 'year');
	  map.title=response.getAttribute(match, 'title');
	  map.cartographer=response.getAttribute(match, 'cartographer');
	  map.cartographerlocation=response.getAttribute(match, 'cartographerlocation');
	  map.medium=response.getAttribute(match, 'medium');
	  map.colour=response.getAttribute(match, 'colour');
	  map.size=response.getAttribute(match, 'metric');
	  map.image=response.getAttribute(match, 'image');
	  map.stocklevel=response.getAttribute(match, 'stocklevel', 0);
	  map.isreserved=response.getAttribute(match, 'isreserved', false);
	  map.inbasket=response.getAttribute(match, 'this', 0);
	  map.outbasket=response.getAttribute(match, 'that', 0);

	  var classname=[ 'buylink' ];

	  if (map.isreserved ||
	      map.stocklevel>0 && map.stocklevel-map.inbasket-map.outbasket<=0)
	    classname.push('reserved');

	  if (map.inbasket==0 && map.stocklevel>0) classname.push('available');
	  if (map.inbasket>0) classname.push('basket');

	  var mapbody=
	    [ 'div', { 'id': 'mapbody'+stockcode, classname: 'maplistitem regionbody' } ];

	  if (map.image)
	    mapbody.push
	      ([ 'a',
		 { href: '/map/id.'+stockcode, title: map.title,
		   classname: 'maplistimage',
		   onmouseover: jpmaps.maptip },
		 [ 'img',
		   { src: '/mapimages/thumbnail/'+map.image, alt: map.title } ] ]);

	  var desc=[ 'p', '.paler', 'By ', [ 'span', '.black', map.cartographer ] ];

	  if (map.cartographerlocation!='')
	    desc.push(' of ', [ 'span', '.black', map.cartographerlocation ]);

	  desc.push
	    ('.', [ 'span', '.black', map.medium ], ', ',
	     [ 'span', '.black', map.colour ]);

	  if (map.size!='') desc.push(', ', [ 'span', '.black', map.size ], ' cm');
	  desc.push('.');

	  var buttons=[ 'div', { classname: classname, id: 'buylinkmap'+stockcode } ];

	  if (collection)
	    buttons.push
	      ([ 'a', { classname: 'more rounded button', href: '/map/id.'+collection },
		 'About This Collection' ]);

	  else
	    buttons.push
	      ([ 'a', { classname: 'more rounded button', href: '/map/id.'+stockcode },
		 'Read More' ]);

	  buttons.push
	    (' ', [ 'span', '.basket inbasket', 'In Your Basket' ], ' ',
	     [ 'a',
	       { classname: 'basket remove rounded del button',
		 onclick: jpmaps.removefrombasket }, 'Remove' ], ' ',
	     [ 'a', { classname: 'basket basketlink', href: '/basket' },
	       'View Basket' ]);

	  if (!collection)
	    buttons.push
	      (' ',
	       [ 'a',
		 { classname: 'available buy rounded save button',
		   onclick: jpmaps.addtobasket }, 'Buy!' ]);

	  buttons.push
	    (' ',
	     [ 'a',
	       { classname: 'available enquire rounded button',
		 href: '/product-enquiry/product.map/id.'+stockcode },
	       'Enquire' ], ' ',
	     [ 'span', '.reserved tag', 'Reserved' ], ' ',
	     [ 'span', '.sold tag', 'Sold' ]);

	  mapbody.push
	    ([ 'div', 'malisttext',
	       desc,
	       [ 'p', '.paler', 'Price: ',
		 [ 'span', { 'id': 'mapprice'+stockcode, classname: 'mapprice' },
		   map.retaildisplay ] ],
	       buttons ]);

	  horus.appendChild(map.node, mapbody);
	  horus.swapClass(jpmaps.maps[stockcode].node, 'open', 'closed');
	}

	horus.removeClass(map.node, 'busy');
	horus.matchHeight();
      }
    }
  };


jpmaps.showmap=
  function ( map ) {
    map=horus.parentTag(map, 'div.map', 0);
    var stockcode=horus.toId(map);

    if (jpmaps.maps[stockcode]) {
      horus.swapClass(jpmaps.maps[stockcode].node, 'open', 'closed');
      horus.matchHeight();
    } else {
      horus.addClass(map, 'busy');
      horus.ajax(jpmaps.searchaction, 'map', { stockcode: stockcode }, jpmaps.fetchmap);
    }

    return false;
  };


jpmaps.getnextmap=
  function () {
    var stockcode=horus.toId(horus.parentTag(jpmaps.nextmap, 'div.map', 0));
    if (!jpmaps.maps[stockcode]) jpmaps.showmap(jpmaps.nextmap);
    jpmaps.nextmap=horus.nextTag(jpmaps.nextmap, 'div');
    if (jpmaps.nextmap) setTimeout(jpmaps.getnextmap, 1000);
  };


jpmaps.reloadprices=
  function () {
    if (!horus.hash.empty(jpmaps.maps)) {
      for (var stockcode in jpmaps.maps)
	horus.addClass(jpmaps.maps[stockcode].node, 'busy');

      horus.ajax
        (jpmaps.searchaction, 'map',
	 { stockcode: horus.keys(jpmaps.maps) }, jpmaps.fetchmap);

    }

    var response=horus.ajax(jpmaps.searchaction, 'priceranges');

    if (response) {
      var priceranges=response.selectNodes('horus/range');
      jpmaps.ranges={};
      var selected=jpmaps.range.get();
      jpmaps.range.clear();

      for (var i=0; i<priceranges.length; i++) {
	var range=priceranges[i];
	var id=response.getAttribute(range, 'id');
	var low=response.getAttribute(range, 'lowdisplay');
	var high=response.getAttribute(range, 'highdisplay');
	if (low=='') low='under'; else if (high!='') low+=' -';
	if (high=='') high='and above';

	jpmaps.ranges[id]=
	  { low: response.getAttribute(range, 'low'),
	    high: response.getAttribute(range, 'high') };

	jpmaps.range.insert([ 'maps '+low+' '+high, id ], id==selected);
      }
    }
  };


jpmaps.checkkey=
  function ( event ) {
    var k=new horus.event(event).keyCode;
    if (k<32) return true;
    return /^[0-9]$/.test(String.fromCharCode(k));
  };


jpmaps.initsearch=
  function () {
    jpmaps.maps={};
    jpmaps.getsub.stockmaster=horus.select('stockmaster');
    jpmaps.getsub.stocksub=horus.select('stocksub');
    jpmaps.range=horus.select('range');
    jpmaps.currencycallback.push(jpmaps.reloadprices);
    var results=document.getElementById('mapsearchresult');

    if (results) {
      jpmaps.nextmap=horus.firstTag(results, 'div');
      jpmaps.getnextmap();
    }
  };


horus.onLoad(jpmaps.initsearch);

