Function.prototype.curry = function(context, args) {
    var fn = this;
    if (context == null) {
        context = this;
    }
    if (args == null) {
        args = [];
    }
    //args = Array.prototype.slice.call(arguments);
    return function() {
        return fn.apply(context, args.concat(
        Array.prototype.slice.call(arguments)));
    };
};

var openedTagDescription = null;
var autoCompleter = null;
var woopraEnabled = false;


if (typeof(woopraTracker) == 'undefined') {
	woopraTracker = {};
}

function showTagDescription(id, event) {
	if (openedTagDescription) {
		openedTagDescription = null;
		$('#tag_desc_' + openedTagDescription).hide();
	}	
	$('#tag_desc_' + id).show();

	openedTagDescription = id;
}

function hideTagDescription(id) {	
	$('#tag_desc_' + id).hide();
	openedTagDescription = null;
}

function addSelectOption(el, value, text) {
	var option = document.createElement("OPTION");
	option.value = value;
	option.innerHTML = text;
	
	$(el).append(option);
	
	return option;
}



function showBlock() {
	if (document.getElementById('advanced-search').style.display == "none")
	{
		document.getElementById('advanced-search').style.display = "block";
		document.getElementById('product-tags').style.display = "none";	
	} else {
		document.getElementById('advanced-search').style.display = "none";
		document.getElementById('product-tags').style.display = "block";
	}
}


Comparison = function () {	

}

Comparison.emptyMobileImage = '/images/frontend/all/mobile-small.gif';
Comparison.deleteImage = '/images/frontend/icons/cross.png';
Comparison.addIcon = '/images/frontend/icons/compare.gif';
Comparison.addActiveIcon = '/images/frontend/icons/compare-active.gif';


Comparison.getStorage = function(type) {

	var comparisonString = Cookie.get("comparison_" + type);
	var comparisonList = [];
	if (comparisonString != null && comparisonString.length > 0) {	
		comparisonString = Base64.decode(comparisonString);
		comparisonList =  $.evalJSON(comparisonString);
	} else {
	}
	return comparisonList;
	
}

Comparison.saveInStorage = function(type, list) {
	var serialized = $.toJSON(list);
	serialized = Base64.encode(serialized);
	Cookie.set("comparison_" + type, serialized);		
}

Comparison.has = function(type) {	
	var comparisonList = Comparison.getStorage(type);
	return comparisonList.length > 0;
}

Comparison.need = function() {	
	if ($("#comparison_block") != null) {
		$(window).bind('resize' , Comparison.alignBlock);
		$(window).bind('scroll' , Comparison.alignBlock);		
		Comparison.alignBlock();		
		return true;
	}
	
	return false;	
}

Comparison.alignBlock = function() {
	
	var height = $(document.body).height();
	var elementHeight = 162; //$("comparison_block").getHeight()
	
	//var offsets = document.viewport.getScrollOffsets();
	var offsetTop = $(window).scrollTop();
	$("#comparison_block").css('top', (height + offsetTop - elementHeight - 20) + "px");


}

Comparison.add = function(type, name, safeName, photo, eventSource) {
	var comparisonString = Cookie.get("comparison_" + type);
	var comparisonList = Comparison.getStorage(type);
	
	for (var i = 0; i < comparisonList.length; i++) {
		if (comparisonList[i].safeName == safeName) {
			Comparison.remove(type, i);
			return;
		}
	}	
	
	if (comparisonList.length >= 4) {
		alert("Sorry you are allowed to compare up to 4 products");
		return;
	}
	
	var newItem = {};
	newItem["linkId"] = eventSource.id;
	newItem["name"] = name;
	newItem["safeName"] = safeName;
	newItem["photo"] = photo;
	comparisonList.push(newItem);	
	/*
	Comparison.setIcon(eventSource, true);*/
	
	var elements = Comparison.findElements(newItem["linkId"]);
	for (var i = 0; i < elements.length; i++) {
		Comparison.setIcon(elements[i], true);
	}
	
	Comparison.saveInStorage(type, comparisonList);
	Comparison.render(type, comparisonList);
	
	woopraTracker.addToComparison(name);
}

Comparison.remove = function(type, index) {

	var comparisonString = Cookie.get("comparison_" + type);
	var comparisonList = Comparison.getStorage(type);
	
	if (index < comparisonList.length) {
		var tmp = [];

		var elements = Comparison.findElements(comparisonList[index].linkId);
		for (var i = 0; i < elements.length; i++) {
			Comparison.setIcon(elements[i], false);
		}
		 
		for (var i = 0; i < comparisonList.length; i++) {
			if (i != index) {
				tmp.push(comparisonList[i]);
			}
		}
		
		comparisonList = tmp;
		Comparison.render(type, comparisonList);		
	}

	Comparison.saveInStorage(type, comparisonList);	
}


Comparison.findElements = function(linkId) {
	var elements = $('a[id="' + linkId +'"]');
	return elements;
}

Comparison.clear = function(type) {
	var comparisonString = Cookie.get("comparison_" + type);
	var comparisonList = Comparison.getStorage(type);
	 
	for (var i = 0; i < comparisonList.length; i++) {	
		Comparison.setIcon($('#' + comparisonList[i].linkId).get(), false);		
	}
	Comparison.render(type, []);	
	Comparison.saveInStorage(type, []);	

}


Comparison.render = function(type, comparisonList) {
	
	var headerTitle = '';
	if (type == "phone") {
		headerTitle = "Compare phones";		
	} else {
		headerTitle = "Compare tariffs";
	}
		
	$('#compare_link').val('/' + type + 's/compare');
	$('#compare_type').val(type);
	$('#comparison_header').html(headerTitle + ' <span class="small dashed clr" onclick="Comparison.clear(' + '\'' + type + '\'' + ')">(clear all)</span>');
	
	
	for (var i = 0; i < 4; i++) {
		var element = $("#comparison_item" + (i + 1));
		if (i < comparisonList.length) {
			var comparisonItem = comparisonList[i];
			element.html('<img src="' + comparisonItem["photo"] + '" alt="' + comparisonItem["name"]  + '"/>'
			                   + '<img src="' + Comparison.deleteImage + '" alt="" onclick="Comparison.remove(' + "'" + type + "'" + ', ' + i + ')" class="delete" />');
		} else {
			element.html('<img src="' + Comparison.emptyMobileImage + '" alt=""/>');			
		}
	}	
	
	if (comparisonList.length > 0) {
		$("#comparison_block").show();
	} else {
		$("#comparison_block").hide();
	}
}

Comparison.setIcon = function(linkObject, status) {
	if (linkObject == null) {
		return;
	}
	
	var children = $(linkObject).children('img')

	if (children.length == 0) {
		return;
	}
	var img = children.get(0);
	
	if (status) {
		$(linkObject).addClass("active");	
		img.src = Comparison.addActiveIcon;
	} else {
		$(linkObject).removeClass("active");		
		img.src = Comparison.addIcon;
	}
}

Comparison.compare = function() {

	var type = $('#compare_type').val();
	var url = $('#compare_link').val() + '#compare$';

	var comparisonList = Comparison.getStorage(type);
	var parts = [];
	for (var i = 0; i < comparisonList.length; i++) {		
		parts.push(comparisonList[i].safeName);		
	}
	
	url += parts.join('-vs-');	

	Comparison.saveInStorage(type, []);
	
	Comparison.render(type, []);

	document.location.href = url;
}


Comparison.load = function(type) {
	Comparison.loadActiveItems(type);
	Comparison.bindHandlers(type);
}

Comparison.loadActiveItems = function(type) {
	var comparisonList = Comparison.getStorage(type);

	if (comparisonList.length > 0) {
		Comparison.render(type, comparisonList);	
		
		for (var i = 0; i < comparisonList.length; i++) {
					
			var elements = Comparison.findElements(comparisonList[i].linkId);
			for (var j = 0; j < elements.length; j++) {
				Comparison.setIcon(elements[j], true);
			}
			 
		}
	}	

}
Comparison.bindHandlers = function(type) {
	$('#compare_btn').bind('click', Comparison.compare);
}



showSubmenu = function(element) {
	var ch = $(element).children('.sub-menu').show();
}

hideSubmenu = function(element) {
	$(element).children('.sub-menu').hide();
}



var sh = null;

doAutocomplete = function() {
	
	if ($('#search-input').val().length < 3) {
		return;
	}
	
	$.get("/search/autocomplete",
		  {q: $('#search-input').val()},
		  function (result) {
			 $('#autocomplete-result').html(result);			 
						 
			 $('#autocomplete-result').stop().fadeIn(300);
			 
		  },
		  'html'
			);
}

parseUrl = function (str) {
	var tokens = str.split('&');
	var result = {};
	for (var i = 0; i < tokens.length; i++) {
		var t = tokens[i].split('=');
		if (t.length > 1) {
			result[t[0]] = t[1];		
		}
	}
	
	return result;
}

openBuyUrl = function (pageUrl, pageTitle) {
	
	// also track google analytics   
    if (typeof(_gat) != 'undefined') {
       t =_gat._getTracker(gaCode);
  	   t._trackEvent('Outbound Links', pageUrl);	
 	}
	
	woopraTracker.trackExternal(pageUrl, pageTitle);
	
	window.open(pageUrl);
	//setTimeout('window.open("' + pageUrl + '")', 300); 
	
	
}

function woopraReady(tracker) {
    tracker.setDomain('mymobiles.com');
    tracker.setIdleTimeout(300000);
    tracker.track();

	woopraTracker.trackExternal = function (pageUrl, pageTitle) {

		var data = {};
		data.name = pageUrl;
		data.type = "exit";
		data.title = pageTitle;
		
	    woopraTracker.pushEvent(data);
	    
	  
   		
	};

	woopraTracker.postRating = function (rating, object) {	


		var data = {};
		data.name = object;
		data.type = "rating";
		data.rating = rating;
		
		
	    woopraTracker.pushEvent(data);
				
	};					

	woopraTracker.postReview = function (name, email, avatar, text, rating, object) {

			
		var data = {};
		data.name = object;
		data.type = 'review';
		data.rating = rating;
		data.comment = text;
		data.email = email;
		
		if (avatar != null) {
			data.user = avatar;
		}
		if (avatar) {
			data.avatar = avatar;
		}
		
	    woopraTracker.pushEvent(data);	
		
	};

	woopraTracker.changePhoto = function (object, img) {				
		
		var data = {};
		data.name = object;
		data.type = 'Change photo';
		data.img = img;
	    woopraTracker.pushEvent(data);
	};


	woopraTracker.maximizePhoto = function (object) {
	
		
		var data = {};
		data.name = object;
		data.type = 'Maximize photo';
	    woopraTracker.pushEvent(data);	
		
	};		


	woopraTracker.addToComparison = function ( object) {	

		var data = {};
		data.name = object;
		data.type = 'Add to comparison';
	    woopraTracker.pushEvent(data);	
	}

	woopraTracker.fcbLike = function (object) {	

		var data = {};
		data.name = object;
		data.type = 'Facebook Like';
	    woopraTracker.pushEvent(data);	
	}
	
	
	woopraTracker.trackSearch = function (value) {		

		var data = {};
		data.name = 'search';
		data.type = 'search';
		data.query = value;
		
		ev=new WoopraEvent('search', data);
		ev.fire();
		tracker.sleep(400);

	};
	
	woopraTracker.trackComparison = function (value) {	
		
	
		var data = {};
		data.name = 'comparison';
		data.type = 'comparison';
		data.compare = value;
	    woopraTracker.pushEvent(data);	
		
	};

	woopraTracker.trackDealsFilter = function (value) {	
		

		var data = {};
		data.name = 'Deals filter';
		data.type = 'Deals filter';
		data.query = value;
	    woopraTracker.pushEvent(data);	
		
	};
	
	woopraTracker.trackNewsletterSubscription = function (value) {			

		var data = {};
		data.name = 'Newsletter subscription';
		data.type = 'Newsletter subscription';
		data.email = value;
	    woopraTracker.pushEvent(data);	
	};
	
	woopraTracker.trackNewsletterSubscriptionConfirmed = function (value) {	
					
		var data = {};
		data.name = 'Newsletter subscription confirmed';
		data.type = 'Newsletter subscription confirmed';
		data.email = value;
	    woopraTracker.pushEvent(data);	
	};	
	
	woopraTracker.trackNewsletterUnsubscribe = function (value) {	
	
		var data = {};
		data.name = 'Newsletter unsubscribed';
		data.type = 'Newsletter unsubscribed';
		data.email = value;
	    woopraTracker.pushEvent(data);	
	};
	
	woopraTracker.trackMultipleTagsSelected = function (value) {						

		var data = {};
		data.name = 'Multiple Tags Selected';
		data.type = 'Multiple Tags Selected';
		data.tags = value;
	    woopraTracker.pushEvent(data);	
	};
	

	woopraTracker.trackCampaign = function () {
		
		var q = document.location.search;
		
		if (q.length == 0) {
			return;
		}
		
		if (q.charAt(0) == '?') {
			q = q.substr(1, q.length - 1);  
		}
	
		var tokens = parseUrl(q);

	
		if (typeof(tokens['utm_source']) == 'undefined' || typeof(tokens['utm_medium']) == 'undefined') {
			return;		
		}

		var data = {};
		data.name = 'Google AdWords';
	
		if (typeof(tokens['utm_source']) != 'undefined') {
			data.utm_source = tokens['utm_source'];	
		}
		if (typeof(tokens['utm_medium']) != 'undefined') {
			data.utm_medium = tokens['utm_medium'];	
		}
		if (typeof(tokens['utm_term']) != 'undefined') {
			data.utm_term = tokens['utm_term'];	
		}
		if (typeof(tokens['utm_content']) != 'undefined') {
			data.utm_content = tokens['utm_content'];	
		}
		if (typeof(tokens['utm_campaign']) != 'undefined') {
			data.utm_campaign = tokens['utm_campaign'];	
		}
		if (typeof(tokens['Network']) != 'undefined') {
			data.Network = tokens['Network'];	
		}
		if (typeof(tokens['SiteTarget']) != 'undefined') {
			data.SiteTarget = tokens['SiteTarget'];	
		}
		

	    woopraTracker.pushEvent(data);	
	};
	
	woopraTracker.trackCampaign();
    return false;
}

$(function () {
	if (woopraEnabled) {
		/*
		var _wh = ((document.location.protocol=='https:') ? "https://sec1.woopra.com" : "http://static.woopra.com");
		document.write(unescape("%3Cscript src='" + _wh + "/js/woopra.js' type='text/javascript'%3E%3C/script%3E"));*/
		

		var wsc = document.createElement('script');
	    wsc.src = document.location.protocol+'//static.woopra.com/js/woopra.js';
	    wsc.type = 'text/javascript';
	    wsc.async = true;
	    var ssc = document.getElementsByTagName('script')[0];
	    ssc.parentNode.insertBefore(wsc, ssc);
	}		
		
	
	$('#search-input').bind('keydown', function (e) {
		
		if (sh != null) {
			clearTimeout(sh);
		}
		
		sh = setTimeout('doAutocomplete()', 300);
		
		if (e.keyCode == 13) {
			if (woopraEnabled) {
				woopraTracker.trackSearch($('#search-input').val());
			}
			e.preventDefault();

			$('#search-form').submit();
		}
	});
	
	$('#search-input').bind('blur', function (e) {
		if (sh != null) {
			clearTimeout(sh);
		}
		setTimeout('closeAutocomplete()', 1200);
	});
	
	closeAutocomplete = function() {	

		$('#autocomplete-result').html('');
		$('#autocomplete-result').stop().fadeOut(200);
	}
	
		
				
		$('#search-submit').bind('click', function () {			
			if (woopraEnabled && typeof(woopraTracker) != 'undefined') {
				woopraTracker.trackSearch($('#search-input').val());
			}			
			$('#search-form').submit();
		});

		$('#search-input').attr("autocomplete", "off");
		
		woopraTracker = {};
		woopraTracker.trackExternal = function (pageUrl, pageTitle) {}			
		woopraTracker.addToComparison = function () {}		
		woopraTracker.changePhoto = function () {}			
		woopraTracker.maximizePhoto = function () {}
		woopraTracker.trackMultipleTagsSelected = function () {}
		woopraTracker.trackCampaign = function () {}
		woopraTracker.trackSearch = function () {}
		woopraTracker.postRating = function () {}
		woopraTracker.postReview = function () {}
		woopraTracker.trackComparison = function () {}
		woopraTracker.trackDealsFilter = function () {}
		woopraTracker.trackNewsletterSubscription = function () {}
		woopraTracker.trackNewsletterSubscriptionConfirmed = function () {}
		woopraTracker.trackNewsletterUnsubscribe = function () {}
		woopraTracker.trackMultipleTagsSelected = function () {}
		woopraTracker.fcbLike  = function () {}
		
	}


)
var Base64 = {
		 
		// private property
		_keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
	 
		// public method for encoding
		encode : function (input) {
			var output = "";
			var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
			var i = 0;
	 
			input = Base64._utf8_encode(input);
	 
			while (i < input.length) {
	 
				chr1 = input.charCodeAt(i++);
				chr2 = input.charCodeAt(i++);
				chr3 = input.charCodeAt(i++);
	 
				enc1 = chr1 >> 2;
				enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
				enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
				enc4 = chr3 & 63;
	 
				if (isNaN(chr2)) {
					enc3 = enc4 = 64;
				} else if (isNaN(chr3)) {
					enc4 = 64;
				}
	 
				output = output +
				this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) +
				this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4);
	 
			}
	 
			return output;
		},
	 
		// public method for decoding
		decode : function (input) {
			var output = "";
			var chr1, chr2, chr3;
			var enc1, enc2, enc3, enc4;
			var i = 0;
	 
			input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
	 
			while (i < input.length) {
	 
				enc1 = this._keyStr.indexOf(input.charAt(i++));
				enc2 = this._keyStr.indexOf(input.charAt(i++));
				enc3 = this._keyStr.indexOf(input.charAt(i++));
				enc4 = this._keyStr.indexOf(input.charAt(i++));
	 
				chr1 = (enc1 << 2) | (enc2 >> 4);
				chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
				chr3 = ((enc3 & 3) << 6) | enc4;
	 
				output = output + String.fromCharCode(chr1);
	 
				if (enc3 != 64) {
					output = output + String.fromCharCode(chr2);
				}
				if (enc4 != 64) {
					output = output + String.fromCharCode(chr3);
				}
	 
			}
	 
			output = Base64._utf8_decode(output);
	 
			return output;
	 
		},
	 
		// private method for UTF-8 encoding
		_utf8_encode : function (string) {
			string = string.replace(/\r\n/g,"\n");
			var utftext = "";
	 
			for (var n = 0; n < string.length; n++) {
	 
				var c = string.charCodeAt(n);
	 
				if (c < 128) {
					utftext += String.fromCharCode(c);
				}
				else if((c > 127) && (c < 2048)) {
					utftext += String.fromCharCode((c >> 6) | 192);
					utftext += String.fromCharCode((c & 63) | 128);
				}
				else {
					utftext += String.fromCharCode((c >> 12) | 224);
					utftext += String.fromCharCode(((c >> 6) & 63) | 128);
					utftext += String.fromCharCode((c & 63) | 128);
				}
	 
			}
	 
			return utftext;
		},
	 
		// private method for UTF-8 decoding
		_utf8_decode : function (utftext) {
			var string = "";
			var i = 0;
			var c = c1 = c2 = 0;
	 
			while ( i < utftext.length ) {
	 
				c = utftext.charCodeAt(i);
	 
				if (c < 128) {
					string += String.fromCharCode(c);
					i++;
				}
				else if((c > 191) && (c < 224)) {
					c2 = utftext.charCodeAt(i+1);
					string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
					i += 2;
				}
				else {
					c2 = utftext.charCodeAt(i+1);
					c3 = utftext.charCodeAt(i+2);
					string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
					i += 3;
				}
	 
			}
	 
			return string;
		}
	 
}

var Cookie = {
		set: function(name,value,seconds){
			if(seconds){
				var d = new Date();
				d.setTime(d.getTime() + (seconds * 1000));
				var expiry = '; expires=' + d.toGMTString();
			}else
				var expiry = '';
			document.cookie = name + "=" + value + expiry + "; path=/";
		},
		get: function(name){
			var nameEQ = name + "=";
			var ca = document.cookie.split(';');
			for(var i = 0; i < ca.length; i++){
				var c = ca[i];
				while(c.charAt(0) == ' ')
					c = c.substring(1,c.length);
				if(c.indexOf(nameEQ) == 0)
					return c.substring(nameEQ.length,c.length);
			}
			return null;
		},
		unset: function(name){
			Cookie.set(name,'',-1);
		}
	};



