var pageProduct = function($,obj) {
  var cache=!!(sessionStorage && typeof JSON !== "undefined"),_product={},_categoryProducts=[],duplicates=[],_categoryIDs=[],_categories={},foundApprovedCategory=false,
  getData = function(id,sku) {        
	return (sessionStorage.getItem(id) && cache) ? JSON.parse(sessionStorage.getItem(id)) : (function(){
		// MAKE THE WEB SERVICES CALL EVEN IF JSON, AND SESSIONSTORAGE AREN'T AVAILABLE																							  
		if(id.indexOf("product_") === 0) {
			return $.ajax("/soap/Product/getProductsRequest?publickey=" + that.pToken +"&products=1&product_0=" + sku + "&variations=false")
			.always(function(){/*console.assert(arguments[1] === "success");*/});
		}
		else if(id.indexOf("category_") === 0) {
			return $.ajax("/soap/Product/getProductsRequest?publickey=" + that.pToken +"&category=" + id.slice(9) + "&variations=false")
			.always(function(){/*console.assert(arguments[1] === "success");*/});
		}
	}());
  },
  setData = function(obj) {
    if(cache) {
      $.each(obj,function(key,value) {
        try {
			sessionStorage.setItem(key,JSON.stringify(value));
        }
        catch(e) {console.log(e);}
      });
    }
  },
  getCategoryIDs = function() {
	  $.each(_product[that.id].categories,function(key,obj){_categoryIDs.push(key);});
  },
  getCategoryProducts = function() {
	  var categoryArray = [];
	  $.each(_categoryIDs,function(index,value) {
			categoryArray.push(getData("category_"+value,null));
			//if(that.approvedCategories.indexOf(value) !== -1) {foundApprovedCategory=true;}
		});	  
	  $.when.apply(window,categoryArray).then([
			function(){
				var xmlDoc,obj={};
				if(arguments.length > 1 && arguments.length === 3 && arguments[1] === "success") { 
					// THIS IS A SUCCESSFULLY RESOLVED JQUERY DEFERRED OBJECT
				   xmlDoc=$.parseXML(arguments[2].responseText);
				   filterXML(_categoryProducts,xmlDoc,false);
				   obj["category_"+_categoryIDs[0]] = _categoryProducts;
				   if(cache){setData(obj);}
				}
				else if(arguments.length > 1 && arguments[1] !== "success") {
					// THIS PRODUCT IS ASSIGNED TO MULTIPLE CATEGORIES, SO STORE THEM SEPARATELY 
					$.each(arguments,function(index,arg) {
						// CHECK IF THIS IS A DFD
						var tempArray = [];
						if(arg instanceof Array && arg.length === 3 && arg[1] === "success") {
							xmlDoc=$.parseXML(arg[2].responseText);
							filterXML(tempArray,xmlDoc,false);
							obj["category_"+_categoryIDs[index]] = tempArray;
							if(cache){setData(obj);}
							_categoryProducts = _categoryProducts.concat(tempArray);	
						}
						else {
							_categoryProducts = _categoryProducts.concat(arg);
						}
					});
				}
				else if(arguments.length === 1) {
				   _categoryProducts = arguments[0];
				}
				// UNCOMMENT THE FOLLOWING LINE TO ALLOW FILTERING WHICH CATEGORIES GET THE CATEGORYPRODUCTS TAB
				//if(foundApprovedCategory){buildCategoryProducts();}
				
		},
		function(){_categoryProducts.sort(sortCategoryProducts);},
		filterCategoryProducts,
		buildCategoryProducts]);
  },
  sortCategoryProducts = function(a,b) {
		var A = a.name.toLowerCase(), B = b.name.toLowerCase();
		if (A < B){return -1;}
		else if (A > B){return  1;}
		else{duplicates.push(b);return 0;}		
  },
  filterCategoryProducts = function() {
	  var l1 = duplicates.length,l2=_categoryProducts.length,i=0,j=0;
	  for(i;i<l1;i+=1) {
		  for(j;j<l2;j+=1) {
			  if(_categoryProducts[j].name == duplicates[i].name) {
				  i++;
				  if(i>=l1){break;}
				  _categoryProducts.splice(j,1);
				  j=0; 
			  }
		  }
	  }
  },
  // FOR NOW WE'RE ONLY INTERESTED IN THIS SMALL SUBSET OF THE PRODUCT XML
  // KEEPING IT SMALL FOR SESSIONSTORAGE IS A PLUS
  filterXML = function(obj,xml,useDescription) {
	  $(xml.getElementsByTagName("Product")).each(function(index) {
			var k = (obj instanceof Array) ? obj.length : $(this.getElementsByTagName("ID")).text();
			obj[k] = {
				id:$(this.getElementsByTagName("ID")).text(),
				name:$(this.getElementsByTagName("Name")[0]).text(),
				imageURL:$(this.getElementsByTagName("ImageURL")[0]).text(),
				iconURL:$(this.getElementsByTagName("IconURL")[0]).text(),
				SKU:$(this.getElementsByTagName("SKU")[0]).text(),
				summary:$(this.getElementsByTagName("Summary")[0]).text(),
				URL:$(this.getElementsByTagName("Url")[0]).text(),
				description:(useDescription) ? $(this.getElementsByTagName("Description")[0]).text() : "",
				categories:(function(cat){
					var cArray = {};
					$(cat).each(function(index){
						cArray[$(this.getElementsByTagName("id")[0]).text()] = $(this.getElementsByTagName("Name")[0]).text();						
					});
					return cArray;
				}(this.getElementsByTagName("Category")))
			};						
		});
  },
  productFailed = function() {
	  console.log("failed");
	  console.log(arguments);
  },
  buildCategoryProducts = function() {
	$("<div/>",{"class":"tab",text:"Category Products"}).insertAfter(".tab:last");
	$("<div/>",{"class":"catTabContainer tabcontent"}).insertAfter(".tabcontent:last");
	$("<div/>",{"class":"categoryProducts"}).each(function() {
		var cPDiv = $(this);
		cPDiv.append("<h4>More products from the "+_product[that.id].categories[_categoryIDs[0]]+" category.</h4>");
		$.each(_categoryProducts,function(index,obj) {
			$("<a/>",{href:obj.URL,title:obj.name,text:obj.name})
			.html("<div class='cPTooltip'><h5>"+obj.name+"</h5>"+
				  "<img src='"+dynamicImageBase+encodeURIComponent(obj.iconURL)+categoryProductsThumbnailSize+"' title='"+obj.SKU+"' alt='"+obj.iconURL+"'/>"+ 
				  "<span class='tooltipSummary'>"+obj.summary+"</span>"+
				  "</div>"+
				  "<span>"+obj.name+"</span>")
			.appendTo(cPDiv);
		});
		cPDiv.appendTo(".tabcontent:last");
	});
  },
  test = function() {
	  console.log(that);	  
	  console.log("sessionStorage["+that.id+"] == _product == " + (sessionStorage.getItem("product_"+that.id) === JSON.stringify(_product)));
	  console.log("_product.categories = {"+(function(){var h=[];for(c in _product[that.id].categories){h.push(c + " : " + _product[that.id].categories[c]);};return h.toString();}())+"}");console.dir(_product); 
	  for(c in _product[that.id].categories) {
	  	console.log("sessionStorage["+c+"] == ");
		console.dir(JSON.parse(sessionStorage.getItem("category_"+c)));
	  }
  },
  /**
	* DEFAULT SETTINGS WHICH CAN BE OVERRIDDEN BY PASSING IN AN OBJECT WHEN INSTANTIATING
	*/
	defaults = {
		pToken:null
	},
	/**
	* PUBLIC INTERFACE FOR THE LEARNING CENTER OBJECT
	*/
	that = $.extend({},defaults,obj);
  
  $(function() {
    $.when(getData("product_"+that.id,that.sku))
		.then([
				   function(){var obj={},xmlDoc;
					   if(arguments.length > 1 && arguments[1] === "success") {
						   xmlDoc=$.parseXML(arguments[2].responseText);
						   filterXML(_product,xmlDoc,true);
						   obj["product_"+that.id] = _product;
						   if(cache){setData(obj);}
					   }
					   else if(arguments.length === 1) {
						   _product = arguments[0];
					   }				
				   },				   
				   getCategoryIDs,
				   getCategoryProducts
			   ],
			  productFailed
		);
  });
  
  that.categoryIDs = function(){return _categoryIDs;};
  that.categoryProducts = function(){return _categoryProducts;};
  that.self = function(){return _product;};
  that.test = test;
  return that;
};
