Array.prototype.intersection = function( setB ) {  
	var setA = this;  
	
	var setA_seen = {};  
	var setB_seen = {};  
	for ( var i = 0; i < setB.length; i++ ) {  
		setB_seen[ setB[i] ] = true;  
	}  
	
	var intersection = [];  
	for ( var i = 0; i < setA.length; i++ ) {  
		if ( !setA_seen[ setA[i] ] ) {  
			setA_seen[ setA[i] ] = true;  
			if ( setB_seen[ setA[i] ] ) {  
				intersection.push( setA[i] );  
			}  
		}  
	}  
		
	return intersection;  
};

var product_config = '';
var size_options = new Array();
var color_options = new Array();
var color_id = 0;
var size_id = 0;
var attribute_price_change = {};
var first_exec = 0;
var exec_code = '';

// settings for jqzoom and small images
var per_page = 5;
var page_num = 1;
var cur_page = 1;
var cur_image = 0;

function get_configurable_options (options_div_id,prod_id) {
	var options_div = $j('#' + options_div_id);
	
	$j.getJSON('/acagogo/product/configurableproductjson/id/' + prod_id + '/cacheing/1',
		function(data) {
			
			product_config = data;
			
			var color_id_string = '';
			var config_string = '';
			
			$j.each(data.attributes, function(i,item){
				
				var first_run = false;
				
				// GET COLOR SWATCHES
				//==============================
				if (item.label.toLowerCase() == 'color') {
					
					color_options = item.options;
					color_id = item.id;
					
					if (first_exec == 0) first_exec = item.id;
					
					options_div.append('<li><label for="Color" class="label smlabel">Color:</label><select id="color_select" name="Color" class="select auto" onchange="color_click(this.options[this.selectedIndex].value);"><option>Select Colors</option></select><input type="hidden" id="attribute'+ item.id + '" name="super_attribute[' + item.id + ']" class="required-entry" value=""></li>');
					
					var arr_length = item.options.length;
					for (var i = 0; i < arr_length; i++) {
						$j('#color_select').append('<option value="' + item.id + '|' + item.options[i].id + '">' + item.options[i].label + '</option>');
						
						if ((first_exec == item.id) && (!first_run)) {
							exec_code = 'color_click("' + item.id + '|' + item.options[i].id + '")';
							first_run = true;
						}
					}
					
					if (first_exec == item.id) {
						eval(exec_code);
					}
				}
				
				first_run = false;
				
				// GET SIZE SWATCHES
	    		//==============================
				if (item.label.toLowerCase() == 'size') {
					
					if (first_exec == 0) first_exec = item.id;
				
					size_options = item.options;
					size_id = item.id;
				
					options_div.append('<li><label for="size" class="label smlabel">Size:</label><a href="#" class="sizechart link" id="sizechart">Size Chart</a><p class="sizechoices" id="sizechoices"></p><input type="hidden" id="attribute'+ item.id + '" name="super_attribute[' + item.id + ']" class="required-entry" value=""></li>');
					
					// size chart display
					//==================================
					var size_code = '<a href="#" id="cart_popup_dropdown" onclick="$j(\'.size_popup\').toggle(); return false;">close</a><div class="clear"><!-- --></div><table><thead><tr><th style="width: 50px;">Size</th><th style="width: 70px;">Chest</th><th style="width: 60px;">Waist</th></tr></thead><tbody><tr><td>s</td><td>34 - 36</td><td>30 - 31</td></tr><tr><td>m</td><td>36 - 38</td><td>32 - 33</td></tr><tr><td>l</td><td>39 - 41</td><td>34 - 35</td></tr><tr><td>xl</td><td>42 - 44</td><td>36 - 37</td></tr><tr><td>xxl</td><td>45 - 47</td><td>38 - 40</td></tr><tr><td>xxxl</td><td>48 - 50</td><td>42 - 44</td></tr><tr><td>xxxxl</td><td>51 - 53</td><td>44 - 46</td></tr></tbody></table>';
	
					$j('body').prepend('<div class="size_popup" id="size_popup_div">' + size_code + '</div>');					
					
					var pos = $j('#sizechart').offset();
					$j('.size_popup').css({'left':(pos.left-143) + 'px','top':(pos.top+14) + 'px'});
					$j('#sizechart').click(function(e) { 
						e.preventDefault();
						$j('.size_popup').toggle();
					});
					//==================================
		
					var arr_length = item.options.length;
					for (var i = 0; i < arr_length; i++) {
						add_size_select (item.options[i]);
						
						if ((first_exec == item.options[i].id) && (!first_run)) {
							exec_code = 'size_click(' + size_id + ',' + item.options[i].id + ',\'' + item.options[i].label + '\',' + item.options[i].price + ')';
							first_run = true;
						}
					}
					
					if (first_exec == item.id) {
						eval(exec_code);
					}
				}
			});    		
		}
	);
}

function color_click(color_info) {
	var split_arr = color_info.split('|');
	attribute_id = split_arr[0];
	color_id = split_arr[1];
	
	$j('#attribute' + attribute_id).val(color_id);
	
	attribute_price_change['att' + attribute_id] = get_color_price_change(attribute_id,color_id);
	
	render_prices();
	
	update_product_image();
}

function get_color_price_change(attribute_id,color_id) {
	var length = color_options.length;
	
	var price_change = 0;
	
	for (var i = 0; i < length; i++) {
		if (color_options[i].id == color_id) {
			price_change = color_options[i].price;
			break;
		}
	}
	
	return parseFloat(price_change);
}

function add_size_select (size_obj) {
	var size_str = size_obj.label;
	$j('#sizechoices').append('<a href="#" id="size_op_' + size_obj.id + '" onclick="size_click(' + size_id + ',' + size_obj.id + ',\'' + size_obj.label + '\',' + size_obj.price + '); return false;">' + size_str + '</a>');
}

function get_dependent_item(attributes,attribute_id) {
	var att_item;
	$j.each(attributes, function(i,item){
		//alert(item.id + ' - ' + attribute_id);
		if (item.id.toString() == attribute_id.toString()) {
			att_item = item;
			return false;
		}
	});
	return att_item
}

function show_sizes(attribute_id,color_id) {
	var valid_products = new Array();
	
	var att_item = get_dependent_item(product_config.attributes,attribute_id);
	
	var op_length = att_item.options.length;
	for (var j = 0; j < op_length; j++) {        				
		if (att_item.options[j].id == color_id) {
			valid_products = att_item.options[j].products;
			break;
		}
	}
	
	var valid_length = valid_products.length;
	var size_length = size_options.length;
	
	$j('#size_swatches').html('');
	
	for (var i = 0; i < size_length; i++) {
		var test_arr = valid_products.intersection(size_options[i].products);
		if (test_arr.length > 0) {
			add_size_select(size_options[i]);
		}
	}        	
}

function size_click(attribute_id,size_id,size_name,price_change) {
	//$j('#chosen_size_name').text(size_name);
	$j('#attribute' + attribute_id).val(size_id);
	
	attribute_price_change['att' + attribute_id] = price_change;
	
	render_prices();
	
	show_colors(attribute_id,size_id);
	
	$j('#sizechoices a').removeClass('size_sel');
	$j('a#size_op_' + size_id).addClass('size_sel');
	
	update_product_image();
}

function show_colors(attribute_id,size_id) {
	var valid_products = new Array();
	
	var att_item = get_dependent_item(product_config.attributes,attribute_id);

	var op_length = att_item.options.length;
	for (var j = 0; j < op_length; j++) {        				
		if (att_item.options[j].id == size_id) {
			valid_products = att_item.options[j].products;
			break;
		}
	}
	
	var valid_length = valid_products.length;
	var color_length = color_options.length;
	
	$j('#color_select').html('<option>Select Colors</option>');
	
	for (var i = 0; i < color_length; i++) {
		var test_arr = valid_products.intersection(color_options[i].products);
		
		if (test_arr.length > 0) {
			add_color_select(color_options[i]);
		}
	}          	
}

function add_color_select (color_obj) {
	var color_str = color_obj.label;
	$j('#color_select').append('<option value="' + color_id + '|' + color_obj.id + '|' + color_obj.price + '">' + color_str + '</option>');
}



function render_prices(price_change) {
	
	var base_price = parseFloat(product_config.basePrice);
	var old_price = parseFloat(product_config.oldPrice);

	for (var i in attribute_price_change) {
		base_price += attribute_price_change[i];
		old_price += attribute_price_change[i];
	}
	
	if (product_config.oldPrice != product_config.basePrice) {
		$j('#old-price-' + product_config.productId).text(price_format(old_price));
                $j('#product-price-' + product_config.productId).html(price_format(base_price));
	} else {
            $j('#product-price-' + product_config.productId).html('<span class="price">' + price_format(base_price) + '</span>');
        }
	
}

function price_format(price) {
	var str = '';	
    price = parseFloat(price);	
    str += '$' + price.toFixed(2);
    return str;
}

function go_image (image_action) {
	if (((cur_image + image_action) >= 0) && ((cur_image + image_action) < image_list.images.length)) {
		var offset = (cur_page-1) * per_page;
		var limit = ((cur_page-1) * per_page) + per_page;
		
		acdc_updateMainImage(cur_image + image_action);
		
		if (cur_image >= limit) {
			show_page(page_num + 1);
		}
		
		if (cur_image < limit) {
			show_page(page_num - 1);
		}
	}
}

function update_image_list(new_image_list) {
	page_num = 1;
	cur_page = 1;
	cur_image = 0;
	image_list = new_image_list;
}

function show_page(cur_page) {		
	var offset = (cur_page-1) * per_page;
    var limit = ((cur_page-1) * per_page) + per_page;
	    
	if ((offset <= image_list.images.length) && (cur_page > 0)) {
	    var gal_container_id = '#gallery-container<?php echo $_product->getId() ?>';
	    
	    var code = '';
	    
	    if (limit > image_list.images.length) {
	    	limit = image_list.images.length;
	    }
	    
	    for (var i = offset; i < limit; i++) {
	    	code += '<li><a href="#" onclick="acdc_updateMainImage(' + i + ');">';
	    	code += '<img src="' + image_list.images[i].small + '" alt="' + image_list.images[i].label + '" />';
	        code += '</a></li>';
	    }
	    
	    $j(gal_container_id).html(code);
	    
	    page_num = cur_page;
	}
}

function acdc_updateMainImage(image_id) {		
	$j('#basket').html('<a href="' + image_list.images[image_id].large + '" class="media_main_image" id="jqzoom' + image_id + '"><img src="' + image_list.images[image_id].medium + '" alt="' + image_list.images[image_id].lable + '" /></a>');
		
	$j("#jqzoom" + image_id).jqzoom(options);
	cur_image = image_id;
}

function update_product_image() {
	
	var small_json_string = '{"x": "50","y": "40","r": "255","g": "255","b": "255"}';
	var small_json_var_name = 'x50y40r255g255b255';
	var medium_json_string = '{"x": "350","y": "320","r": "255","g": "255","b": "255"}';
	var medium_json_var_name = 'x350y320r255g255b255';

	var url = '/acagogo/product/productjson/product_id/' + product_id + '/medias/{"medias":[' + small_json_string + ',' + medium_json_string + ']}/attributes/{';
	var check = true;
	var first = true;
	$j('[id^=attribute].required-entry').each(function() {
		if ($j(this).val() > 0) {
			if (!first) {
				url += ',';
			}
			url += '"' + $j(this).attr('id').replace('attribute','') + '":"' + $j(this).val() + '"';
			var attr_id = $j(this).attr('id');
			var attr_val = $j(this).val();
			first = false;
		} else {
			check = false;
		}
	});

	url += '}/cacheing/1';

	if (check) {

		$j.getJSON(url, function(data) {
			if (data.media_gallery.length > 0) {
				var first = true;
				var image_cnt = data.media_gallery.length;

				$j('#prod_title').html(data.name)
				$j('#spec_div_text').html(data.description);
				$j('#short_desc').html(data.short_description);

				var json_text = '{"images": [';
				for (var i = 0; i < image_cnt; i++) {
					if (!first) {
    					json_text += ',';
    				}
					json_text += '{';
					json_text += '"id":"' + data.media_gallery[i].value_id + '",';
					json_text += '"small":"' + data.media_gallery[i][small_json_var_name].replace(/\\/g,'') + '",';
					json_text += '"medium":"' + data.media_gallery[i][medium_json_var_name].replace(/\\/g,'') + '",';
					json_text += '"large":"' + data.media_gallery[i].large_image_full_path.replace(/\\/g,'') + '",';
					json_text += '"label":"' + data.media_gallery[i].label_default + '"';
					json_text += '}';
					first = false;
				}
				json_text += "]}";

				var images_list = eval('(' + json_text + ')');
				update_image_list(images_list);
				show_page(1);
				go_image(0);
			}
		});
	}
}

function check_stock(pid) {
	$j.get('/acagogo/product/instockjson/product_id/' + pid + '/' + d.valueOf(), 
		function(data) {
			if (data == 'false') {
				$j('#product_addtocart_form').html('<p class="prod_message">This product is currently out of stock</p>');
			}
		}
	);
}
