/*****************
 Minicart classes
******************/

/* Divider line between items */
function Line(){}
Line.prototype.toElement = function(){
	return new Element('tr').insert(
		new Element('td',{
			'colspan': '2',
			'class':'line'
		})
	);
}

/* Displays the quantity and title */
function ItemInfo(item){
	this._item = item;
}
ItemInfo.prototype.primaryRow = function(){
	//console.log("drawing primary row");
	return new Element('tr').insert(
		new Element('td',{
			'scope':'row',
			'class':'qty',
			'id':'cartitem_'  + this._item.skuId
		}).update(this._item.quantity)
	).insert(
		new Element('td',{'class':'item'}).update( 
			new Element('a',{
				'href': this._item.url,
				'id':'cartlink_' + this._item.skuId
			}).update(this._item.titlePrinted)
		)
	);
}

ItemInfo.prototype.priceRow = function(){
	//console.log("drawing price row");
	var row = new Element('tr');
	row.insert( new Element('td'));
	//console.log(this._item.onSale);
	if (this._item.onSale) {
		row.insert( 
			new Element('td',{'class':'price'})
				.update("<div class='strike'>" + this._item.listPrice + "</div><div class='red'>" + this._item.salePrice + "</div>" )				
		);
	} else {
		row.insert( 
			new Element('td',{'class':'price'})
				.update("<div class='price'>" + this._item.listPrice + "</div>" )
		);		
	}
	return row;
}


/* List of items (table) */
function ItemList(order){
	this._order = order;
	this._isicfr = order.type == "icfrOrder";
}
ItemList.prototype.toElement = function(){
	var tbody = new Element('tbody');
	this._order.items.each(function(item){
		itemInfo = new ItemInfo(item)
		tbody.insert(itemInfo.primaryRow());
		if(!this._isicfr){
			tbody.insert(itemInfo.priceRow());
		}
		tbody.insert(new Line());
	});
	var t = new Element('table',{'id':'orderItemsTbl','summary':'Basket content, quantity and price'}).insert(tbody);	
	//console.log(t.inspect());
	return t;
}



// Retrieve a snippet of HTML code via an asynchronous HTTP request located at reqUrl
// Replace the contents of an HTML element with id value parentId
function updateHTMLviaHTTP(reqUrl, parentId)
{
	var req = false;

	var errorBag = document.getElementById("errorBag"); //clear errors
	if (errorBag != null) {
		if (errorBag.innerHTML != null) {
			if (errorBag.innerHTML.length > 0) {
				errorBag.innerHTML = "";
			}
		}
	}

	if (window.XMLHttpRequest) {
		req = new XMLHttpRequest();
		// IE7 now supports XMLHttpRequest but their implementation does not have an <code>overrideMimeType</code> method
		// The result is an ugly JS error and a notable lack of site functionality
		if( req.overrideMimeType ) req.overrideMimeType("text/xml"); // Avoid browser-lock in older Mozilla versions
	}
	else if (window.ActiveXObject) {
		try	{
			req = new ActiveXObject("Microsoft.XMLHTTP");
		}
		catch (e) {}
	}
	if (!req) {
		return false;
	}

	req.onreadystatechange = function() {
		if (req.readyState == 4 && req.status == 200) {
			var el = document.getElementById(parentId);

			// Look for the marker text which separates error message in case no institutions found,
			// and the institutions drop-down box (see renderInstitutionSelect.jsp).
			// If this marker exists, put HTML before it to "errorBag" and HTML after it - to "parentId";
			// otherwise, all the HTML goes to "parentId" element.
			index = req.responseText.indexOf('<!--NO INSTITUTIONS FOUND-->');
			if (index > 0) {
				errorBag.innerHTML = req.responseText.substr(0, index);
				el.innerHTML = req.responseText.substr(index);
			}
			else
				el.innerHTML = req.responseText;
		}
	}
	req.open("GET", reqUrl, true);
	req.send(null);
}


function ajaxReqToAddToCart(url, cartType) {
	new Ajax.Request(url, {
		method :'post',
		onSuccess: function(transport) {
			try{
				response = transport.responseText.evalJSON();
				renderMiniCart(response, cartType);
				showItemAddedNotice( response, 'b2bType' );
			}
			catch(e){
				alert(e);
			}
		}
	});
}

function renderMiniCart( responseObj, cartType){
	var order = responseObj.order;
	var basketContainer;
	if (cartType == 'SearchCart'){
		var list = $('list');
		if (list != null)
			list.addClassName('basket');
	    basketContainer = $('basketRight');	 
	}
	if (cartType == 'EcomCart')
	   basketContainer = $('miniCart');
	var shoppingBasket = $('shoppingBasket');
	if (shoppingBasket == null) {
		basketContainer.insert(new Element('div', {'id':'shoppingBasket'}));  
		shoppingBasket = $('shoppingBasket');   		   
	}
	shoppingBasket.update(
		new Element('div', {'id':'basket'}).insert(
			new Element('div', { 'id': 'headerEcomm'})
		).insert(
			new Element('div', { 'id': 'bodyOuter' }).insert(
				new Element('div', { 'id': 'bodyInner' }).insert(
					new Element('div', { 'id': 'headings' }).update('Qty Item')
				)
				.insert(new ItemList(order) )
				.insert( renderSubtotal( responseObj.order.total ) )
				.insert( renderMiniCartButton(
					'checkout', 'ECommProduct.nav?cartAction=add', '/img/bttnBasketCheckout.png',
					'bttnBasketCheckout', 'Checkout' ) )
				.insert( renderMiniCartButton(
					'edit', 'ECommProduct.nav?cartAction=edit', '/img/bttnBasketEdit.png',
					'bttnBasketEdit', 'Edit Basket' ) )
			)
		).insert(
			new Element('div',{'id':'basketfooter'})
		)
	);
}

function showItemAddedNotice(response, itemType){
	var itemAdded;
	var noticeId;
	if (itemType == 'icfrType')
	  itemAdded = $('icfrItem_' + response.addedItem.skuId);	
	if (itemType == 'b2bType')
       itemAdded = $('cartitem_' + response.addedItem.skuId);
	if (itemType == 'errorType') {
		itemAdded = $('icfrItem_' + response.skuId); 	
	    noticeId = 'errorNotice';
	}
	var itemAddedPos = itemAdded.viewportOffset();
	if (itemType != 'errorType') 
	    noticeId = ( itemAddedPos[1] > 0 ) ? 'itemAddedNotice' : 'itemAddedNoticeBig';
	var left = itemAddedPos[0] - 183;
	var yOffSet = getYOffset();
	var top = itemAddedPos[1] - 43 + yOffSet;
	if ( itemAddedPos[1] < 0 ){
		left = itemAddedPos[0] - 20;
		top = yOffSet;
	}
	$(noticeId).show().setStyle({
		'top' : top + 'px',
		'left' : left + 'px'
	});
	setTimeout("$('" + noticeId + "').fade({ duration: 0.3 })",3000);
}
   
 function getYOffset() {
	var pageY;
	if (typeof (window.pageYOffset) == 'number') {
		pageY = window.pageYOffset;
	} else {
		pageY = document.documentElement.scrollTop;
	}
	return pageY;
}

function renderMiniCartButton( id, url, imageSrc, imageClass, imageAlt ){
	return new Element('div', {'id':id})
		.insert(
			new Element('a', {'href':url})
				.insert(
					new Element('img', {'src':imageSrc,'class':imageClass,'alt':imageAlt})
		)
	);
}

function renderSubtotal( orderSubtotal ){
	return new Element('div', {'id':'subtotal'})
		.update("<strong>Subtotal " + orderSubtotal + "</strong");
}

function ajaxReqToAddToICFRCart(url) {
	url.toQueryParams();
	new Ajax.Request(url, {
		method :'post',
		onSuccess: function(transport) {
			try{
				responseObj = transport.responseText.evalJSON();
				if (responseObj.exception != null){
					var errorDiv = $('errMessage');
					errorDiv.update(responseObj.exception);	
					//showErrorNotice();
					showItemAddedNotice(responseObj, 'errorType');
					return;
				}
				renderICFRCart( transport.responseText.evalJSON() );
				showItemAddedNotice(responseObj, 'icfrType');
			}
			catch(e){
				// Do nothing...
			}
		}
	});
}

function renderICFRCart( responseObj ){	
	var basketContainer = $('miniCart'); 
    var icfrBasket = $('icfrBasket'); 
    if (icfrBasket == null) {
    	 basketContainer.insert(new Element('div', {'id':'icfrBasket'}));  
    	 icfrBasket = $('icfrBasket');
    }
    icfrBasket.update(new Element('div', {'id':'basket'}).insert(
			new Element('div', { 'id': 'headerICFR'}).insert(
					new Element('div', { 'id': 'headerTxt' }))
		).insert(
			new Element('div', { 'id': 'bodyOuter' }).insert(
				new Element('div', { 'id': 'bodyInner' }).insert(
					new Element('div', { 'id': 'headings' }).update('Qty Item')
				)
				.insert( renderICFRCartTable( responseObj.order.items ) )
				.insert( renderMiniCartButton(
					'checkout', 'ICFRProduct.nav', '/img/bttnICFRBasketCheckout.png',
					'bttnICFRBasketCheckout', 'Checkout' ) )
				.insert( renderMiniCartButton(
					'edit', 'ICFRProduct.nav', '/img/bttnICFRBasketEdit.png',
					'bttnICFRBasketEdit', 'Edit Basket' ) )
			)
		).insert(
			new Element('div',{'id':'basketfooter'})
		)
	);
}

function renderICFRCartTable( items ){
	var tbody = new Element('tbody');
	for( var i = 0; i < items.length; i++ ){
		tbody.insert(
			new Element('tr').insert(
				new Element('td', {'class':'qty', 'scope':'row', 'id': 'icfrItem_' + items[i].skuId }).update( items[i].quantity )
			).insert(
				new Element('td', {'class':'icfr_item'}).update( 
					new Element('a', {'href':items[i].url, 'id': 'icfrlink_' + items[i].skuId }).update( items[i].quantity)
						.update(items[i].titlePrinted) ) ) ).insert( new Line() );
		
	}
	return new Element('table', { 'id': 'orderItemsTbl','summary':'Basket content and quantity' }).insert(tbody);
}



function openEBookWindow(isbn)
{
   if (isbn != null && isbn != '') {
      var popup = window.open("http://www.ebooks.com/SearchApp/SearchResults.net?term="+isbn,null, 
    		                   "width=1000, height=760, status=1, toolbar=1, scrollbars=yes, menubar=1");
      if (popup != null)
    	  popup.moveTo(30,30);
   
   }
}

/*
 * A helper function that will disable or enable all non-hidden form elements
 * underneath <param>container</param> depending on the value of
 * <param>controllingValue</param>
 */
function syncFormState(controllingValue, container, isNew){
	// Check to make sure the container exists
	if(container){
		container.select("input", "select").each(function(input){
			if(controllingValue) {
				if(isNew) {
					if(input.type.toLowerCase() == 'checkbox') {
						input.checked = false;
						input.enable();
					}
					else input.enable().clear();
				}
				else input.enable();
			}
			else input.disable();
		});
	}
	(controllingValue) ? container.removeClassName("hidden").show() : container.hide();
}
