// Place your application-specific JavaScript functions and classes here
// This file is automatically included by javascript_include_tag :defaults

var linkBase = 'http://rover.ebay.com/rover/1/711-53200-19255-0/1';
var imageBase = 'http://thumbs.ebaystatic.com/pict/';
var itemCategory;
var campaignID;
var toolID;
var customID;

var cgiBaseEncoding = {
  'buy': 'http%3A%2F%2Fcgi.ebay.com%2F',
  'nice': 'http%3A%2F%2Fcgi.liveauctions.ebay.com%2Fws%2FeBayISAPI.dll%3FViewItem%26item%3D'
};
var itemPrefix = {
    'buy': '_W0QQitemZ',
    'nice': ''
};
var codePrefix = {
    'buy': 'QQcmdZViewItemQQssPageNameZRSS%3AB%3ASRCH%3AUS%3A',
    'nice': '%26ssPageName%3DRSS%3AB%3ASRCH%3AUS%3A'
};
var watchListBase = {
    'buy': 'http%3A%2F%2Fcgi1.ebay.com%2Fws%2FeBayISAPI.dll%3F',
    'nice': 'http%3A%2F%2Fcgi1.liveauctions.ebay.com%2Fws%2FeBayISAPI.dll%3F'
};
var watchListItemPrefix = 'MfcISAPICommand%3DMakeTrack%26item%3D';

var titleTranslation =     // A '~' means remove
    "                                " + // 0-31 Control characters => space
      "       ~        "  + // 32-47 Punctuation => space
      "0123456789" + // 48-57 Numbers => number
      "       " + // 58-64 Punctuation => space
      "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + // 65-90 Letters => letter
      "      " + // 91-96 Punctuation => space
      "abcdefghijklmnopqrstuvwxyz" + // 97-122 Letters => letter
      "     " + // 123-127 Punctuation => space
      "          S   Z       " + // 128-149
      "    s   zY          " + // 150-169
      "                    " + // 170-189
      "  AAAAAA CEEEEIIIIDN" + // 190-209
      "OOOOO OUUUUYPBaaaaaa" + // 210-229
      " ceeeeiiiionooooo ouuuuypy" // 230 + 255

function translateUTF8(code)
{
    if (code >= 0 && code <= 255) {
	return titleTranslation.charCodeAt(code);
    }
    else {
	return 32;
    }
};

function urlTitle(title)
{
    i = 0;
    ltitle = '';
    while (i < title.length) {
	code = translateUTF8(title.charCodeAt(i));
	if (code != 126) {
	    ltitle += String.fromCharCode(code);
	}
	i++;
    }
    ltitle = ltitle.replace(/^ +/, '').replace(/ +$/, '').replace(/ +/g, '-');
    return ltitle;
};

function makeElement(tag, attributes, contents, indent)
{
    elem = (indent || '') + '<' + tag;
    for (var attr in attributes) {
	elem += ' ' + attr + '="' + attributes[attr] + '"';
    }
    if (contents) {
	if (indent) {
	    elem += ">\n" + 
		contents + 
		"\n" + indent + '</' + tag + '>';
	}
	else {
	  elem += '>' + contents + '</' + tag + '>';
	}
    }
    else {
	elem += '/>';
    }
    return elem;
}

function itemLinkURL(codeType)
{
  // return this.linkBase + '?campid=' + this.campaignID + '&customid=' + 
  //   this.customID + '&toolid=' + this.toolID + '&mpre=' + 
  //   cgiBaseEncoding[this.cgiBase] + this.linkTitle + itemPrefix[this.cgiBase] +
  //   this.number + codePrefix[this.cgiBase] + codeType;
    return this.linkBase + '?icep_ff3=' + this.icepFf3 +
	'&toolid=' + this.toolID + '&campid=' + this.campaignID +
	'&customid=' + this.customID + '&icep_item=' + this.number +
	'&ipn=' + this.ipn + '&icep_vectorid=' + this.icepVectorID +
	'&kwid=' + this.kwID + '&mtid=' + this.mtID + '&kw=rss';
};

function itemWatchURL(codeType)
{
  // return this.linkBase + '?campid=' + this.campaignID + '&customid=' +
  //    this.customID + '&toolid=' + this.toolID + '&mpre=' + 
  //    watchListBase[this.cgiBase] + watchListItemPrefix + this.number + 
  //    codePrefix['nice'] + codeType;
    return this.linkBase + '?ff3=4' +
      '&toolid=' + this.toolID + '&campid=' + this.campaignID +
      '&customid=' + this.customID +
      '&mpre=' + watchListBase[this.cgiBase] +
      watchListItemPrefix + this.number +
      codePrefix['nice'] + codeType;	
};

function imageURL(externalID)
{
  return imageBase + externalID + '_0.jpg';
};

function linkURL(cgiBase, linkTitle, externalID, codeType)
{
  // return linkBase + '?campid=' + campaignID + '&customid=' + customID +
  //   '&toolid=' + toolID + '&mpre=' + cgiBaseEncoding[cgiBase] + linkTitle +
  //   itemPrefix[cgiBase] + externalID + codePrefix[cgiBase] + codeType;
    var icepFf3 = '2';
    var ipn = 'psmain';
    var icepVectorID = '238401';
    var kwID = '902099';
    var mtID = '824';
    return linkBase + '?icep_ff3=' + icepFf3 +
	'&toolid=' + toolID + '&campid=' + campaignID +
	'&customid=' + customID + '&icep_item=' + externalID +
	'&ipn=' + ipn + '&icep_vectorid=' + icepVectorID +
	'&kwid=' + kwID + '&mtid=' + mtID + '&kw=rss';
};

function watchLinkURL(cgiBase, externalID, codeType)
{
    return linkBase + '?ff3=4' + '&toolid=' + toolID +
	'&campid=' + campaignID + '&customid=' + this.customID +
	'&mpre=' + watchListBase[cgiBase] +
	watchListItemPrefix + externalID +
	codePrefix['nice'] + codeType;
};

function ItemCategory(campaignID, toolID, customID) {
  this.campaignID = campaignID;
  this.toolID = toolID;
  this.customID = customID;
}

function ItemLink(codeType, contents) {
  return makeElement('a', { href: this.linkURL(codeType) }, contents);
}

function itemImageLink()
{
    var img = makeElement('img', { alt: this.number, src: this.imageURL });
    return this.link('102', img);
};

function itemTitleLink()
{
    return this.link('101', this.title);
};

function itemBidLink()
{
    return this.link('103', 'Bid now');
};

function itemBuyLink()
{
    return this.link('105', 'Buy it now for only ' + this.binPrice);
};

function itemWatchLink()
{
  return makeElement('a', { href: this.watchURL('104') }, 'Add to watch list');
};

function itemHtml()
{
    indent = ' ';
    indent2 = indent + ' ';
    indent3 = indent2 + ' ';
    indent4 = indent3 + ' ';
    image = makeElement('p', { 'class': 'image' }, indent3 + this.imageLink(),
			indent2);
    titleP = makeElement('p', { 'class': 'title' }, indent4 + this.titleLink(),
			 indent3);
    priceSpan = makeElement('span', { 'class': 'price' }, this.bidPrice);
    bidsSpan = makeElement('span', { 'class': 'bids' }, this.bids);
    if (this.bidPrice) {
      bidP = makeElement('p', { 'class': 'bid' },
			 indent4 + priceSpan + "\n" + indent4 +
			 this.bidLink() + "\n" + indent4 + bidsSpan, indent3);
    }
    else {
      bidP = '';
    }
    if (this.binPrice) {
      buyP = makeElement('p', { 'class': 'buy' }, indent4 + this.buyLink(),
			 indent3);
    }
    else {
      buyP = '';
    }
    watchP = makeElement('p', { 'class': 'watch' }, indent4 + this.watchLink(),
			 indent3);
    div = makeElement('div', {},
		      titleP + "\n" + bidP + "\n" + buyP + "\n" + watchP,
		      indent2);
    return makeElement('div', { 'class': 'item' }, image + "\n" + div, indent);
};

function ParsedItem(itemString, itemCategory)
{
    pieces = itemString.replace(/\n/g, "").split(/<br\/?>/i);
    this.title = pieces[0];
    if (pieces[1] && pieces[1].length > 1) {
	this.binPrice = '$' + pieces[1].split('$')[1]
    }
    if (pieces[2] && pieces[2].length > 0) {
	subPieces = pieces[2].split(' ');
	if (subPieces[0] == 'bid') {
	    this.bidPrice = subPieces[1];
	    this.bids = subPieces[2] + ' ' + subPieces[3];
	    this.number = subPieces[4];
	    this.cgiBase = subPieces[5];
	}
	else {
	    this.number = subPieces[0];
	    this.cgiBase = subPieces[1];
	}	    
    }
    this.imageURL = 'http://thumbs.ebaystatic.com/pict/' +
	this.number + '_0.jpg';
    this.linkTitle = urlTitle(this.title);
    this.linkBase = 'http://rover.ebay.com/rover/1/711-53200-19255-0/1';
    this.linkURL = itemLinkURL;
    this.watchURL = itemWatchURL;
    this.campaignID = itemCategory.campaignID;
    this.toolID = itemCategory.toolID;
    this.customID = itemCategory.customID;
    this.link = ItemLink;
    this.imageLink = itemImageLink;
    this.titleLink = itemTitleLink;
    this.bidLink = itemBidLink;
    this.buyLink = itemBuyLink;
    this.watchLink = itemWatchLink;
    this.html = itemHtml;
    this.icepFf3 = '2';
    this.ipn = 'psmain';
    this.icepVectorID = '238401';
    this.kwID = '902099';
    this.mtID = '824';
}

function makeLink(content, cgiBase, linkTitle, externalID, codeType)
{
  var url = linkURL(cgiBase, linkTitle, externalID, codeType);
  return new Element('a', { href: url }).update(content);
};

function watchLink(content, cgiBase, externalID, codeType)
{
  var url = watchLinkURL(cgiBase, externalID, codeType);
  return new Element('a', { href: url }).update(content);
};

function imageLink(cgiBase, linkTitle, externalID)
{
    var img = new Element('img', { alt: externalID, src: imageURL(externalID) });
    return makeLink(img, cgiBase, linkTitle, externalID, '102');
};

function createItem(element)
{
    foo = new ParsedItem(element.innerHTML, itemCategory);
    element.innerHTML = foo.html();
};

function createItemOld(element)
{
    // var cgiBase = 'base';
    var externalID = element.down('.external_id').innerHTML;
    var cgiBase = element.down('.cgi_base').innerHTML;
    var linkTitle = element.down('.link_title').innerHTML.replace(/ /g, '-');
    var title = element.down('span.title').innerHTML;
    element.down('.external_id').hide();
    element.down('.cgi_base').hide();
    element.down('.link_title').hide();
    element.down('p.image').insert(imageLink(cgiBase, linkTitle, externalID))
    element.down('span.title').replace(makeLink(title + ' ' + title.length, cgiBase, linkTitle, externalID, '101'));
    element.down('p.watch').insert( watchLink('Add to watch list', cgiBase, externalID, '104'));
    var bid = element.down('p.bid');
    if (bid) {
        var bidText = element.down('span.bid_link').innerHTML;
	element.down('span.bid_link').replace(makeLink(bidText, cgiBase, linkTitle, externalID, '103'));
    }
    var buy = element.down('p.buy');
    if (buy) {
        var buyText = element.down('span.buy_link').innerHTML;
	element.down('span.buy_link').replace(makeLink(buyText, cgiBase, linkTitle, externalID, '105'));
    }
}

var ItemLinkupOld = Behavior.create({
  initialize: function() {
    createItemOld(this.element);
  }
});

var ItemLinkup = Behavior.create({
  initialize: function() {
    createItem(this.element);
  }
});

var CategoryInfo = Behavior.create({
  initialize: function() {
    campaignID = $('campaign_id').innerHTML;
    toolID = $('tool_id').innerHTML;
    customID = $('custom_id').innerHTML;
    itemCategory = new ItemCategory(campaignID, toolID, customID);
  }
});

Event.addBehavior({
  'h1': CategoryInfo,
  '.item3': ItemLinkupOld,
  '.item': ItemLinkup
});
