var $j = jQuery.noConflict();
var template_box_id = "template_box";
var output_box_id = "output_box";
var waiting_box_id = "waiting_box";

var MAX_INT = 2147483647;
//http://catalog.bizrate.com/services/catalog/v1/us/product?apiKey=1d7f918aa73a4e50d7aeb0ec317ac667&publisherId=50945&placementId=1&categoryId=&keyword=esri&productId=&productIdType=&offersOnly=true&merchantId=&brandId=&biddedOnly=&minPrice=&maxPrice=&minMarkdown=20&zipCode=&freeShipping=&start=0&results=10&backfillResults=0&startOffers=0&resultsOffers=0&sort=relevancy_desc&attFilter=&attWeights=&attributeId=&resultsAttribute=10&resultsAttributeValues=10&showAttributes=true&showProductAttributes=true&minRelevancyScore=100&maxAge=&showRawUrl=&imageOnly=&format=xml&callback=callback
//http://catalog.bizrate.com/services/catalog/v1/
var shz_params = {
    apiKey: "1d7f918aa73a4e50d7aeb0ec317ac667",
    publisherId: "50945",
    keyword: null,
    showAttributes: true,
    showProductAttributes: true,
    format: "js",
    minMarkdown:0,
    //offersOnly: false,
    //freeShipping: false,
    //biddedOnly: false,
    //sort: 'price_asc',
    //attFilter: '',
    //minPrice: 0,
    //maxPrice: MAX_INT, //biggest signed int
    start: 0
};

function getPropertyValue(obj, path) {
	value = obj;
	propertyNames = path.split(".");	
	for (var i = 0; i < propertyNames.length; i++) {
		value = value[propertyNames[i]];
		if (!value) return (null);
	}
	return(value);
}
function getExpressionValue(obj, expression) {
    if (!obj)
        return (null);
    
    if (!expression || expression == ".")
        return (obj);

    if (typeof obj != "object")
        return (obj);
	
	var expr_parts=expression.split("~");
	if(expr_parts.length==1)
		return(getPropertyValue(obj, expr_parts[0]));
	
	var result="";	
	for (var j = 0; j < expr_parts.length; j++) {
		var expr_part = expr_parts[j];
		if(expr_part[0]=="#")
		{
			result=result+expr_part.substr(1);
			//alert(result);
		}
		else
		{			
			value = getPropertyValue(obj, expr_part);
			if (!value || value=='') return (null);			
			result=result+value;
		}
	}
	
    return (result);
}

function render_single_tmpl_txt(tmpl_txt, params, obj) {
    for (var i = 0; i < params.length; i++) {
        param = params[i];
        expression = param.replace('`', '').replace('`', '');
        value = getExpressionValue(obj, expression);
        if (!value) value = "";
        //var patt = new RegExp(param, "ig");
		while(tmpl_txt.indexOf(param)>-1)
			tmpl_txt = tmpl_txt.replace(param, value);
    }
    return (tmpl_txt);
}

function render_tmpl_txt(tmpl_txt, obj) {
    var value = "";
    //tmpl_txt=unescape(tmpl_txt);
    var params = tmpl_txt.match(/`[^`]*`/ig);
    if (params) {
        value = render_single_tmpl_txt(tmpl_txt, params, obj);
    }
    else value = tmpl_txt;

    return (value);

}

function do_bind_array(element, obj) {
    var org_html = element.html();
    var value = "";
    for (var i = 0; i < obj.length; i++) {
        var org_elm = document.createElement('div');
        org_elm.innerHTML = org_html;
        $j(org_elm).children().each(function () { walk($j(this), obj[i]); });
        new_html = $j(org_elm).html();
        new_html = render_tmpl_txt(new_html, obj[i]);
        value = value + new_html;
    }
    element.html(value);
}

function do_bind_single(element, obj) {
    element.children().each(function () { walk($j(this), obj); });
    new_html = element.html();
    new_html = render_tmpl_txt(new_html, obj);
    element.html(new_html);

}

function do_bind(element, obj) {

    if ($j.isArray(obj))
        do_bind_array(element, obj)
    else
        do_bind_single(element, obj)

}

function walk(element, obj) {
    var bind_path = element.attr("bind");
    if (bind_path) {
        obj = getExpressionValue(obj, bind_path);
        do_bind(element, obj);
    }
    else element.children().each(function () { walk($j(this), obj); });
}

function fix_urls_for_ie(attributeName, url_attr)
{ $j("[" + url_attr + "]").each(function () { url = $j(this).attr(url_attr); $j(this).attr(attributeName, url); }); }

function renderTemplate() {

    if (!shz_params.keyword || $j.trim(shz_params.keyword) == "")
        return;

    var template = $j("#" + template_box_id).html();
    //$j("#" + template_box_id).html("");
    template = template.replace('<!--', '').replace('-->', '');

    $j("#" + waiting_box_id).attr("style", "display:block");
    $j("#" + output_box_id).attr("style", "display:none");
    $j("#" + output_box_id).html(template);

    
    $j.getJSON("http://catalog.bizrate.com/services/catalog/v1/us/product?callback=?", shz_params,
	//$j.getJSON("http://jezzabelle.com/shopzilla-offers.html?callback=?", shz_params,
  function (data) {
      data.params = shz_params;
	  if(data.offers)
	  {
		//alert("offers");
		if(!data.products)
			data.products={"product":[]};
		if(!data.products.product)
			data.products.product=[];
			
		for(var i=0;i<data.offers.offer.length;i++)
		    data.products.product.push(data.offers.offer[i]);

		data.products.includedResults=data.offers.includedResults;
        data.products.totalResults=data.offers.totalResults;
	  }
      //alert(data.params.start);
      walk($j('#attributes'), data);
      walk($j('#results_box'), data);
      walk($j('#params'), shz_params);
      $j('[set]').each(function () { try { eval($j(this).attr("set")); } catch (err) { } });
	
      create_combos();
      fix_urls_for_ie("href", "_href");
      fix_urls_for_ie("src", "_src");
      $j("#" + waiting_box_id).attr("style", "display:none");
      $j("#" + output_box_id).attr("style", "display:block");
  });
}


function setCheckBox(id, value) {
    if (value != '')
        $j("#" + id).attr('checked', true);
    else
        $j("#" + id).attr('checked', false);
}

function setCombo(id, value) {
    if (value && value != "") {
        //alert($j("#" + id + " option[value='" + value + "']"));
        $j("#" + id + " option[selected]").removeAttr("selected");
        $j("#" + id + " option[value='" + value + "']").attr("selected", "selected");
    }
}
function setPrice(id, value) {
    if (!value || value == MAX_INT || value == 0)
        return;
    $j("#" + id).attr('value', Math.floor(value / 100) + "." + (value % 100).toString());
}
function setFilters(attFilter) {
    if (attFilter && attFilter != "") {
        var attFilters = attFilter.split(";");
        for (var i = 0; i < attFilters.length; i++) {
            var filterParts = attFilters[i].split(":");
            selectItem($j("[attr_id=" + filterParts[0] + "] [attr_value=" + filterParts[1] + "]"));
        }
    }
}
function parseIntX(value) {
    if (value == null || value == '')
        return (0)
    else
        return (parseInt(value));
}
function paging(box_id, current, includedResults, totalResults) {
    current = parseIntX(current);
    //alert(current);
    includedResults = parseIntX(includedResults);
    totalResults = parseIntX(totalResults);
    if (totalResults <= 0)
        return;
    pageCount = Math.ceil(totalResults / 10);
    //show maximum 15 page links current page in the middle, 7 links before , 7 liks after
    startLink = current > 7 ? (current - 7) : 0;
    endLink = (startLink + 14) < pageCount ? (startLink + 14) : (pageCount - 1);
    links = [];

    if (startLink > 0)
        links.push("&nbsp;<a href='#' onclick='go_page(0)' title='first'> &lt;&lt; </a>&nbsp;");
    //if there is any page link then make the list
    if (startLink < endLink) {
        for (i = startLink; i <= endLink; i++) {
            if (current == i)
                links.push((i + 1).toString());
            else
                links.push("<a href='#' onclick='go_page(" + i + ");return(false);'>" + (i + 1).toString() + "</a>");
        }
    }

    if (endLink < (pageCount - 1))
        links.push("&nbsp;<a href='#' onclick='go_page(" + (pageCount - 1).toString() + ")' title='Last'> &gt;&gt; </a>&nbsp;");

    links.push("<div style='float:right'> page " + (current + 1).toString() + " of " + pageCount.toString() + "</div>");

    $j("#" + box_id).get(0).innerHTML = links.join(" ");

}
function go_page(start) {
    shz_params.start = start;
    renderTemplate();
    return (false);
}
//<a set='setNext("`params.start`","`products.totalResults`","`products.includedResults`")'>Next</a>


function searchAgain() {
    var errors = [];
    var params = [];
    $j('#params [get]').each(function () {
        try {
            value = eval($j(this).attr("get"));
            if (value) {
                if (value[0] == "#error")
                    errors.push(value[1]);
                else
                    params.push(value);
            }
        }
        catch (err) { }
    });

    if (errors.length > 0) {
        alert(errors.join("\r\n"))
        return;
    }
    //alert(params);
    for (var key in params) {
        paramName = params[key][0];
        paramValue = params[key][1];
        shz_params[paramName] = paramValue;
    }
    shz_params.start = 0;
    renderTemplate();
}

function getKeyword() {
    value = $j("#keyword").val();
    if (!value || $j.trim(value) == "")
        return ["#error", "Please enter a value for 'keyword' "];
    else
        return ["keyword", value];
}
function isNumber(n) {
    return !isNaN(parseFloat(n)) && isFinite(n);
}

function getPrice(paramName, paramDisplayName, str_value) {
    if (!isNumber(str_value))
        return ["#error", paramDisplayName + " value is not a valid number"];
    else {
        value = Math.round(parseFloat(str_value) * 100);

        if (value < 0)
            return ["#error", paramDisplayName + " can not be less than zerro (0)"];

        if (value > MAX_INT)
            return ["#error", paramDisplayName + " can not be greater than " + MAX_INT.toString()];
        //alert([paramName, value]);
        return ([paramName, value]);
    }
}
function getMinPrice() {
    str_value = $j("#minPrice").val();
    if (!str_value || $j.trim(str_value) == "")
        return (["minPrice", 0]);
    return (getPrice("minPrice", "Minimum price", str_value));
}
function getMaxPrice() {
    str_value = $j("#maxPrice").val();
    if (!str_value || $j.trim(str_value) == "")
        return (["maxPrice", MAX_INT]);
    return (getPrice("maxPrice", "Maximum price", str_value));

}

function getFilters() {
    var attr_values = [];
    $j('[attr_id]').each(function () {
        try {
            attr_value = $j(this).children("input").val();
            if (attr_value && attr_value != "*") {
                attr_values.push($j(this).attr("attr_id") + ":" + attr_value);
            }
        }
        catch (err) { }
    });
    if (attr_values.length > 0)
        return ["attFilter", attr_values.join(";")];
    else
        return ["attFilter", ""];
}

function getCheckBox(id) {
    if ($j("#" + id).is(':checked')) 
        return [id, true];
    else
        return [id, false];
}

function getCombo(id) {
    value = $j("#" + id).val();
    if (value)
        return [id, value];
    else
        return [id, ""];
}

