// +----------------------------------------------------------------------+
// | Optional 2side, v1.0                                                 |
// | Javascript for showing 2side t-shirts at ProstoPrint partners shop   |
// +----------------------------------------------------------------------+
// | Copyright (c) 2009, Andrey Tserkus                                   |
// | E-mail: zerkella at(dog) icool.com.ua                                |
// |                                                                      |
// | Usage, modification and distributing is prohibited unless permitted  |
// | by author                                                            |
// +----------------------------------------------------------------------+

// Script
Opt2Side_Items = new Array();

// Finds words in title or href of an item
function Opt2Side_IsWordFound(words, title, href) {
	var found = false;
	for (var wordIndex = 0, len = words.length; wordIndex < len; wordIndex++) {
		var word = words[wordIndex];
		if (!word.length)
			continue;
		if (title.indexOf(word) >= 0) {
			found = true;
			break;
		}
		if ((word != 'product') && (href.indexOf('/' + word + '/') >= 0)) {
			found = true;
			break;
		}
	}
	return found;
}

// Main func to start it
function Opt2Side_Go() {
	// Get settings from window global object to prevent its obfuscating
	var wnd = window;
	var settings = wnd['Opt2Side_Settings'];
	if (!settings)
		return;
		
	// Process settings
	for (var wordIndex = 0, len = settings.words.length; wordIndex < len; wordIndex++)
		settings.words[wordIndex] = settings.words[wordIndex].toLowerCase();
	if (settings.stopwords) {
		for (var wordIndex = 0, len = settings.stopwords.length; wordIndex < len; wordIndex++)
			settings.stopwords[wordIndex] = settings.stopwords[wordIndex].toLowerCase();
	}
		
	// Check that we are on needed path - catalog or main page
	var realLocation = window.location.href;
	var partLocation = realLocation.substring(8); // Remove starting 'https://' or 'http://' where there'are '/' symbols
	if (!realLocation.match(/catalog/i) && partLocation.match(/\/.+\//i))
		return;
		
	// Gather all needed items
	var aItems = $('.i-img a');
	var imgItems = $('.i-img img');
	var max = Math.min(aItems.length, imgItems.length);
	if (max <= 0)
		return;
		
	var shopID = '';
	for (var i = 0; i < max; i++) {
		var aItem = aItems.eq(i);
		var imgItem = imgItems.eq(i);
		
		// Get title and check whether it's our item
		var title = aItem.attr('title').toLowerCase();
		var href = aItem.attr('href').toLowerCase();
		var found = Opt2Side_IsWordFound(settings.words, title, href);
		if (found && settings.stopwords)
			found = !Opt2Side_IsWordFound(settings.stopwords, title, href);
		if (!found)
			continue;
		
		// Extract product ID
		var res = aItem.attr('href').match(/product\/([^\/]+)\//);
		if (!res || (res.length < 2))
			continue;
			
		// Break it into id and shop name
		var st = res[1];
		var arr = st.split('-');
		if (!arr || (arr.length < 2))
			continue;
			
		var shopID = arr[0];
		var productID = arr[1];
		if (!shopID || !productID)
			return;
		
		// Generate ids for html-nodes, to prevent keeping references (leaks in IE)
		var aID = aItem.attr('id');
		if (!aID) {
			aID = 'opt2sideA_' + Math.round(Math.random() * 100000000);
			aItem.attr('id', aID);
		}
		
		var imgID = imgItem.attr('id');
		if (!imgID) {
			imgID = 'opt2sideIMG_' + Math.round(Math.random() * 100000000);
			imgItem.attr('id', imgID);
		}
		
		// Add it to list of items
		var obj = {};
		obj.productID = productID;
		obj.aID = aID;
		obj.imgID = imgID;
		Opt2Side_Items.push(obj);
	}
	
	if (!Opt2Side_Items.length)
		return;
	if (!shopID)
		return;
		
	// Start timing func to check script arrival
	Opt2Side_Items.dtStart = new Date(); // Used to measure connection speed
	Opt2Side_Items.hndlIsArrived = setInterval(Opt2Side_IsArrived, 500);
	
	// Ask server for item pictures
	var ids = new Array();
	for (var i = 0, len = Opt2Side_Items.length; i < len; i++)
		ids.push(Opt2Side_Items[i].productID);
	var src = 'http://data.icool.com.ua/get_2side.php?type=' + settings.type + '&shopID=' + shopID + '&items=' + ids.join(',') + '&_rnd=' + Math.round(Math.random() * 10000000);
	var script = document.createElement('SCRIPT');
	var head = document.getElementsByTagName('HEAD');
	if (!head.length)
		return;
	head[0].appendChild(script);
	script.src = src;
}

// Check whether items has arrived
function Opt2Side_IsArrived() {
	var wnd = window;
	if (!wnd['Opt2Side_Response'])
		return;
	var response = wnd['Opt2Side_Response'];
	var settings = wnd['Opt2Side_Settings'];
	clearInterval(Opt2Side_Items.hndlIsArrived);
	
	// Check interval - if more than needed - turn off script (low connection)
	var dt = new Date();
	var timePassed = dt.getTime() - Opt2Side_Items.dtStart.getTime();
	if (timePassed > 1500)
		return;
	
	// Extract response data
	for (var i = 0, lenItems = Opt2Side_Items.length; i < lenItems; i++) {
		var item = Opt2Side_Items[i];
		var resItem = response[item.productID];
		if (!resItem)
			continue;
			
		var img = $('#' + item.imgID);
		if (!img.length)
			continue;
			
		if (settings.type == 'blink') {
			item.pic1 = resItem[0];
			item.pic2 = resItem[1];
			
			// Extract new source
			var src = img.attr('src');
			if (src.indexOf(item.pic1) >= 0) {
				src = src.replace(item.pic1, item.pic2);
			} else if (src.indexOf(item.pic2) >= 0) {
				src = src.replace(item.pic2, item.pic1);
			} else {
				continue;
			}
			
			var img2 = img.clone();
			var imgID2 = item.imgID + '_2';
			img2.attr('id', imgID2);
			img2.attr('src', src);
			img2.insertAfter(img);
			img2.hide();
			
			item.imgID2 = imgID2;
			
			// Check tha special spans exist in IE
			var spans = $('#' + item.aID + ' span');
			if (spans.length) {
				var img = spans.eq(0);
				var img2 = img.clone();
				img2.insertAfter(img);
				img2.hide();
				
				var filter = img2.css('filter');
				if (filter.indexOf(item.pic1) >= 0) {
					filter = filter.replace(item.pic1, item.pic2);
				} else if (filter.indexOf(item.pic2) >= 0) {
					filter = filter.replace(item.pic2, item.pic1);
				} else {
					continue;
				}
				img2.css('filter', filter);
				
				var id1 = img.attr('id');
				if (!id1) {
					id1 = item.imgID + '_span';
					img.attr('id', id1);
				}
				var id2 = img2.attr('id');
				if (!id2) {
					id2 = id1 + '_2';
					img2.attr('id', id2);
				}
				
				item.imgID = id1;
				item.imgID2 = id2;
				
			}
		} else if (settings.type == 'merge') {
			img.attr('src', resItem);
			// Check tha special spans exist in IE
			var spans = $('#' + item.aID + ' span');
			if (spans.length) {
				var img = spans.eq(0);
				var filter = img.css('filter');
				var filter = filter.replace(/src='[^']+'/, "src='" + resItem + "'");
				img.css('filter', filter);
			}
		}
	}
	
	// Set blinker
	setInterval(Opt2Side_Blink, settings.interval);
}

// Timed function to change item images to new images
function Opt2Side_Blink() {
	for (var i = 0, lenItems = Opt2Side_Items.length; i < lenItems; i++) {
		var item = Opt2Side_Items[i];
		if (!item.imgID || !item.imgID2)
			return;
			
		var img1 = $('#' + item.imgID);
		if (!img1.length)
			continue;
			
		var img2 = $('#' + item.imgID2);
		if (!img2.length)
			continue;
			
		if (img1.is(':visible')) {
			img1.hide();
			img2.show();
		} else {
			img2.hide();
			img1.show();
		}
	}	
}

// Go
$(document).ready(Opt2Side_Go);

