<?php
/**
 * Shopping API Feed Parser 
 * Vinod 6/16/11
 * Version 1.o
 *
 * @Array   All parameter should be passed in an array
 * Array[KEY]=>[VALUE]
 */

/**
 * Shopping.com API class
 *
 */
class ShoppingAPI {

	private $apiKey = 'c09f2d7e-623a-413f-b33d-acc692ec8d96';
	private $trackingId = '8053472';
	private $apiURL = "http://publisher.api.shopping.com/publisher/3.0/rest/GeneralSearch?";

	/**
	 * Search for Products based on input parameters.
	 *
	 * @param array $data
	 * @return array of Products & Attributes
	 */
	public function ProductSearch($data)
	{
		$data['apiKey'] = $this->apiKey;
		$data['trackingId'] = $this->trackingId;

		foreach ($data as $key => $value)
		$Param .= $key.'='.$value.'&';

		###### INIT DOM XML #####
		$ResultFeed = new DomDocument();
		$FeedUrl = $this->apiURL.$Param;
		if($_GET['debug'] == 'msa123')
		echo '<hr>'.$FeedUrl;

		$ResultFeed->load($FeedUrl);

		$Products = array();
		if ($ResultFeed->getElementsByTagName("product")->item(0)) {

			$count = $ResultFeed->getElementsByTagName("categories")->item(0)->getElementsByTagName("items")->item(0)->getAttribute('returnedItemCount');
			$Listing = $ResultFeed->getElementsByTagName("product");

			for($i=0; $i<$count; $i++) {

				if ($ResultFeed->getElementsByTagName("name")) {
					if ($ResultFeed->getElementsByTagName("product")->item($i)){
						$Products[$i]['product_id'] = $ResultFeed->getElementsByTagName("product")->item($i)->getAttribute('id');
					} elseif ($ResultFeed->getElementsByTagName("offer")->item($i)){
						$Products[$i]['product_id'] = $ResultFeed->getElementsByTagName("offer")->item($i)->getAttribute('id');
					}

					$Products[$i]['name'] = $ResultFeed->getElementsByTagName("name")->item($i)->nodeValue;
					$Products[$i]['short_description'] = $ResultFeed->getElementsByTagName("name")->item($i)->getElementsByTagName("shortDescription")->item(0)->nodeValue;

					$Products[$i]['min_price'] = $ResultFeed->getElementsByTagName("minPrice")->item($i)->nodeValue;
					$Products[$i]['max_price'] = $ResultFeed->getElementsByTagName("maxPrice")->item($i)->nodeValue;

					//Review Info
					if ($ResultFeed->getElementsByTagName("rating")->item($i)){
						$Products[$i]['review_count'] = $ResultFeed->getElementsByTagName("rating")->item($i)->getElementsByTagName("reviewCount")->item(0)->nodeValue;
						if($Products[$i]['review_count']) {

							$Products[$i]['rating'] = $ResultFeed->getElementsByTagName("rating")->item($i)->getElementsByTagName("rating")->item(0)->nodeValue;
							$Products[$i]['rating_image'] = $ResultFeed->getElementsByTagName("rating")->item($i)->getElementsByTagName("ratingImage")->item(0)->getElementsByTagName("sourceURL")->item(0)->nodeValue;
						}
					}

					//Images
//					$Images = $ResultFeed->getElementsByTagName("images");
					if($ResultFeed->getElementsByTagName("product")->item($i)) {
						$Products[$i]['images'][] = $ResultFeed->getElementsByTagName("product")->item($i)->getElementsByTagName("image")->item(0)->nodeValue;
//						$Products[$i]['images'][] = $Images->item(0)->getElementsByTagName("image")->item(1)->nodeValue;
//						$Products[$i]['images'][] = $Images->item(0)->getElementsByTagName("image")->item(2)->nodeValue;
//						$Products[$i]['images'][] = $Images->item(0)->getElementsByTagName("image")->item(3)->nodeValue;
//						$Products[$i]['images'][] = $Images->item(0)->getElementsByTagName("image")->item(4)->nodeValue;
					} elseif ($ResultFeed->getElementsByTagName("offer")->item($i)){
						$Products[$i]['images'][] = $ResultFeed->getElementsByTagName("offer")->item($i)->getElementsByTagName("image")->item(0)->nodeValue;
					}
				}
			}
		}
		//prexit($Products);

		$Attributes = array();
		if ($ResultFeed->getElementsByTagName("attributes")->item(0)) {

			$count = $ResultFeed->getElementsByTagName("categories")->item(0)->getElementsByTagName("attributes")->item(0)->getAttribute('returnedAttributeCount');
			$Attr = $ResultFeed->getElementsByTagName("attribute");

			for($i=0; $i<$count; $i++) {

				if ($Attr->item($i)->getElementsByTagName("name")) {

					$Attributes[$i]['attr_id'] = $ResultFeed->getElementsByTagName("attribute")->item($i)->getAttribute('id');
					$Attributes[$i]['name'] = $Attr->item($i)->getElementsByTagName("name")->item(0)->nodeValue;

					//Attribute Values
					$AttribValues = $Attr->item($i)->getElementsByTagName("attributeValues");
					$values_count = $AttribValues->item(0)->getAttribute('returnedValueCount');
					for($j=0; $j<$values_count; $j++) {

						$Attributes[$i]['attrib_values'][$j]['id'] = $AttribValues->item(0)->getElementsByTagName("attributeValue")->item($j)->getAttribute("id");
						$Attributes[$i]['attrib_values'][$j]['matching_items_count'] = $AttribValues->item(0)->getElementsByTagName("attributeValue")->item($j)->getAttribute("matchingItemsCount");
						$Attributes[$i]['attrib_values'][$j]['name'] = $AttribValues->item(0)->getElementsByTagName("attributeValue")->item($j)->getElementsByTagName("name")->item(0)->nodeValue;
					}
				}
			}
		}
		//	prexit($Attributes);
		return array('Products'=>$Products, 'Attributes'=>$Attributes);
	}

	/**
	 * Get Product details with related offers
	 *
	 * @param array $data
	 */
	public function ProductDetail($data)
	{
		$data['apiKey'] = $this->apiKey;
		$data['trackingId'] = $this->trackingId;

		foreach ($data as $key => $value)
		$Param .= $key.'='.$value.'&';

		###### INIT DOM XML #####
		$ResultFeed = new DomDocument();
		$FeedUrl = $this->apiURL.$Param;
		if($_GET['debug'] == 'msa123')
		echo '<hr>'.$FeedUrl;

		$ResultFeed->load($FeedUrl);
		$Product = array();
		if ($ResultFeed->getElementsByTagName("product")->item(0)) {

			$Listing = $ResultFeed->getElementsByTagName("product");

			if ($Listing->item(0)->getElementsByTagName("name")) {
				$Product['product_id'] = $ResultFeed->getElementsByTagName("product")->item(0)->getAttribute('id');
				$Product['name'] = $Listing->item(0)->getElementsByTagName("name")->item(0)->nodeValue;
				$Product['short_description'] = $Listing->item(0)->getElementsByTagName("shortDescription")->item(0)->nodeValue;
				$Product['full_description'] = $Listing->item(0)->getElementsByTagName("fullDescription")->item(0)->nodeValue;
				$Product['min_price'] = $ResultFeed->getElementsByTagName("minPrice")->item(0)->nodeValue;
				$Product['max_price'] = $ResultFeed->getElementsByTagName("maxPrice")->item(0)->nodeValue;
				$Product['product_offers_url'] = $ResultFeed->getElementsByTagName("productOffersURL")->item(0)->nodeValue;
				$Product['product_specs_url'] = $ResultFeed->getElementsByTagName("productSpecsURL")->item(0)->nodeValue;
				$Product['offer_url'] = $ResultFeed->getElementsByTagName("offerURL")->item(0)->nodeValue;

				$Product['Title'] = $Product['name'];
				$Product['Price'] = $Product['min_price'];
				$Product['Description'] = $Product['full_description'];

				//Review Info
				$Product['review_count'] = $ResultFeed->getElementsByTagName("rating")->item(0)->getElementsByTagName("reviewCount")->item(0)->nodeValue;
				if($Product['review_count']) {
					$Product['rating'] = $ResultFeed->getElementsByTagName("rating")->item(0)->getElementsByTagName("rating")->item(0)->nodeValue;
					$Product['rating_image'] = $ResultFeed->getElementsByTagName("rating")->item(0)->getElementsByTagName("ratingImage")->item(0)->getElementsByTagName("sourceURL")->item(0)->nodeValue;
				}
				
				if ($ResultFeed->getElementsByTagName("Logo")->item(0)){
					$Product['logo'] = $ResultFeed->getElementsByTagName("Logo")->item(0)->getElementsByTagName("Logo")->item(0)->nodeValue;
				}

				//Images
				$Images = $Listing->item(0)->getElementsByTagName("images");
				if($Images->item(0)) {
					$Product['images'][] = $Images->item(0)->getElementsByTagName("image")->item(0)->nodeValue;
					$Product['images'][] = $Images->item(0)->getElementsByTagName("image")->item(1)->nodeValue;
					$Product['images'][] = $Images->item(0)->getElementsByTagName("image")->item(2)->nodeValue;
					$Product['images'][] = $Images->item(0)->getElementsByTagName("image")->item(3)->nodeValue;
					$Product['images'][] = $Images->item(0)->getElementsByTagName("image")->item(4)->nodeValue;
				}

				//Parsing Offers Information
				$Offers = $Listing->item(0)->getElementsByTagName("offers");
				if ($Offers->item(0)->getElementsByTagName("offer")->item(0)) {

					$count = $Offers->item(0)->getAttribute('returnedOfferCount');
					$Offer = $ResultFeed->getElementsByTagName("offer");

					for($i=0; $i<$count; $i++) {

						if ($Offer->item($i)->getElementsByTagName("name")) {

							$Product['offers'][$i]['id'] = $Offer->item(0)->getAttribute('id');
							$Product['offers'][$i]['name'] = $Offer->item($i)->getElementsByTagName("name")->item(0)->nodeValue;
							$Product['offers'][$i]['description'] = $Offer->item($i)->getElementsByTagName("Description")->item(0)->nodeValue;
							$Product['offers'][$i]['manufacturer'] = $Offer->item($i)->getElementsByTagName("manufacturer")->item(0)->nodeValue;
							$Product['offers'][$i]['stock_status'] = $Offer->item($i)->getElementsByTagName("stockStatus")->item(0)->nodeValue;
							$Product['offers'][$i]['base_price'] = $Offer->item($i)->getElementsByTagName("basePrice")->item(0)->nodeValue;
							$Product['offers'][$i]['currency'] = $Offer->item($i)->getElementsByTagName("basePrice")->item(0)->getAttribute('currency');
							$Product['offers'][$i]['shipping_cost'] = $Offer->item($i)->getElementsByTagName("shippingCost")->item(0)->nodeValue;
							if ($Offer->item($i)->getElementsByTagName("shippingCost")->item(0)){
								$Product['offers'][$i]['shipping_currency'] = $Offer->item($i)->getElementsByTagName("shippingCost")->item(0)->getAttribute('currency');
							}
							$Product['offers'][$i]['offer_url'] = $Offer->item($i)->getElementsByTagName("offerURL")->item(0)->nodeValue;
							$Product['offers'][$i]['sku'] = $Offer->item($i)->getElementsByTagName("sku")->item(0)->nodeValue;

							//Offer Image List
							$ImageList = $Offer->item($i)->getElementsByTagName("imageList");
							if($ImageList->item(0)) {
								for($j=0; $j<10 && $ImageList->item(0)->getElementsByTagName("image")->item($j); $j++){
									$Product['offers'][$i]['images'][] = $ImageList->item(0)->getElementsByTagName("image")->item($j)->getElementsByTagName("sourceURL")->item(0)->nodeValue;
								}

//								$Product['offers'][$i]['images'][] = $ImageList->item(0)->getElementsByTagName("image")->item(1)->getElementsByTagName("sourceURL")->item(0)->nodeValue;
//								$Product['offers'][$i]['images'][] = $ImageList->item(0)->getElementsByTagName("image")->item(2)->getElementsByTagName("sourceURL")->item(0)->nodeValue;
//								$Product['offers'][$i]['images'][] = $ImageList->item(0)->getElementsByTagName("image")->item(3)->getElementsByTagName("sourceURL")->item(0)->nodeValue;
//								$Product['offers'][$i]['images'][] = $ImageList->item(0)->getElementsByTagName("image")->item(4)->getElementsByTagName("sourceURL")->item(0)->nodeValue;
							}
							
							//Store Info
							$Store = $Offer->item($i)->getElementsByTagName("store");
							if($Store->item(0)) {
								
								$Product['offers'][$i]['store']['name'] = $Store->item(0)->getElementsByTagName("name")->item(0)->nodeValue;
								$Product['offers'][$i]['store']['phone'] = $Store->item(0)->getElementsByTagName("phoneNumber")->item(0)->nodeValue;
								$Product['offers'][$i]['store']['logo'] = $Store->item(0)->getElementsByTagName("logo")->item(0)->getElementsByTagName("sourceURL")->item(0)->nodeValue;
								$Product['offers'][$i]['store']['country_flag'] = $Store->item(0)->getElementsByTagName("countryFlag")->item(0)->getElementsByTagName("sourceURL")->item(0)->nodeValue;
								$Product['offers'][$i]['store']['country_code'] = $Store->item(0)->getElementsByTagName("countryFlag")->item(0)->getElementsByTagName("countryCode")->item(0)->nodeValue;
							}
						}
					}
				}
			}
		}
		return $Product;
	}
}

?>