/**
 * 	Advanced Device Finder - djuice 2009
 * 	@author	toth.szabolcs@carnation.hu	
 */

function clone(object) {
	function F() {}
	F.prototype = object;
	return new F;
}

function max(a, b){
	return (a>b)?a:b;
}

function min(a, b){
	return (a<b)?a:b;
}

function in_range( value, range) {
	return( value < range[0] || value > range[1] )?false:true;
}

/**
 * 
 * @param {Object} jQuery
 */
(function(jQuery){
	
	var valign = function( i, element ){
		jQuery(element).parent().css({
			position: (jQuery(element).parent().css('position') == 'absolute') ? 'absolute' : 'relative',
			width: jQuery(element).parent()[0].offsetWidth
		});
		
		$(element).css({
			position: 'absolute',
			top: '50%',
			marginTop: (-1 * ( jQuery(element)[0].offsetHeight / 2 ) )
		})
	}
	
	jQuery.fn.extend({
		vMiddle: function(){
			this.each(valign);
		}
	});
	
})(jQuery);



var ADF = {
	service: "ajax_device_advanced_search.php",
	form: "form#search-form",
	submit: "a#search_btn",
	label_prepaid: 'új kártyás előfizetéssel',
	label_postpaid: 'új számlás előfizetéssel',
	label_mixer: 'új mixer előfizetéssel',
	label_huf: 'Ft',	
	label_prepaid_en: 'in new pre-paid package',
	label_postpaid_en: 'in new post-paid package',
	label_mixer_en: 'in new mixer package',	
	label_huf_en: 'HUF',		
	items_per_page: 10,
	result_tpl: [	'<li>',
					'	<div class="in">',
					'		<a class="img" href="<%= this.url %>"><img height="144" width="89" src="<%= this.img_src %>" alt="<%= this.name %>"/></a>',
					'		<b><%= this.name %></b>',
					'		<ul class="features">',
					'			<% for ( var k in this.top4 ){ %>',
					'			<li><%= this.top4[k] %></li>',
					'   		<% } %>',
					'		</ul>',
					'		<ul class="price">',
					'			<li><em><%= ADF.label_postpaid %></em> <strong><%= this.price.postpaid %> <span>Ft</span></strong></li>',
					'			<li><em><%= ADF.label_prepaid %></em> <strong><%= this.price.prepaid %> <span>Ft</span></strong></li>',
					'			<li><em><%= ADF.label_mixer %></em> <strong><%= this.price.mixer %> <span>Ft</span></strong></li>',
					'			<li class="last"><a class="details" href="<%= this.url %>">Részletek</a></li>',
					'		</ul>',
					'	</div>',
					'</li>'].join(''),
					
	result_tpl_en: [	'<li>',
					'	<div class="in">',
					'		<a class="img" href="<%= this.url %>"><img height="144" width="89" src="<%= this.img_src %>" alt="<%= this.name %>"/></a>',
					'		<b><%= this.name %></b>',
					'		<ul class="price">',
					'			<li><em><%= ADF.label_postpaid %></em> <strong><span>HUF</span> <%= this.price.postpaid %></strong></li>',
					'			<li><em><%= ADF.label_prepaid %></em> <strong><span>HUF</span> <%= this.price.prepaid %></strong></li>',
					'			<li><em><%= ADF.label_mixer %></em> <strong><span>HUF</span> <%= this.price.mixer %></strong></li>',
					'			<li class="last"><a class="details_en" href="<%= this.url %>">details</a></li>',
					'		</ul>',
					'	</div>',
					'</li>'].join(''),					

	no_result_tpl: [	'<li class="no_result">',
						'<span class="noresult">Sajnos nem találtunk a megadott feltételeknek megfelelő készüléket.</span>',
						'</li>'	
					].join(''),
					
	no_result_tpl_en: [	'<li class="no_result">',
						'<span class="noresult">No handset found.</span>',
						'</li>'	
					].join(''),					

	pager_tpl:	[	'<div id="ADF_Pager">',
					'	<a class="prev">« Előző</a>',
					'	<a class="limit back">...</a>',
					'<% for ( var k = 1 ; k <= this.pages ; k++){ %>',
					'	<a title="<%= k %>"><%= k %></a>',
					'<% } %>',
					'	<a class="limit forward">...</a>',
					'	<a class="next">Következő »</a>',
					'	<a class="all">Összes találat megjelenítése egy oldalon</a>',
					'</div>'].join(''),
					
	pager_tpl_en:	[	'<div id="ADF_Pager">',
					'	<a class="prev">« Previous</a>',
					'	<a class="limit back">...</a>',
					'<% for ( var k = 1 ; k <= this.pages ; k++){ %>',
					'	<a title="<%= k %>"><%= k %></a>',
					'<% } %>',
					'	<a class="limit forward">...</a>',
					'	<a class="next">Next »</a>',
					'	<a class="all">Show all matches on one page</a>',
					'</div>'].join('')		
}

	ADF.FormParser = function(){
		
		$(document).ready(function(){
			ADF.FormParser.init();
		});
	
		return {
			
			init: function(){
				$(ADF.submit).click(function(e){
					$(e).stopEvent();
					ADF.FormParser.send();
				})				
			},

			
			send: function(){
				var data = $(ADF.form).serialize();
				$.ajax({
					type: "POST",
					url: ADF.service,
					data: data,
					dataType: 'json',
					beforeSend: function(){
						ADF.FormDisplay.loading();
						ADF.ResultsDisplay.loading();
					},
					success: function(msg){
						ADF.FormDisplay.success();
						ADF.FormParser.get(msg);
					},
					error: function(){
						
					}
				});
			},
			
			get: function( msg ){
				var event = jQuery.Event("getresults");
				event.resultData = msg;
				$(ADF.form).trigger(event);
			}
			
		};
		
	}();

	ADF.ResultsDisplay = function(){
/*
 * 
 * TODO
 * 		error icon
 * 
 */		
	
		$(document).ready(function(){
			ADF.ResultsDisplay.init();
		});
		
		return {
			
			init: function(){
// figyeljuk az esemenyt ami jelzi hogy van eredmeny				
			    $(ADF.form).bind("getresults", function(e){
					ADF.ResultsDisplay.get(e.resultData)
			    });				
				this.pager = new ResultPager('ul#ADF_Results','li');
			}, 
// loading ikon/uzenet			
			loading: function(){
				$('#ADF_Loading').show();
				$('ul#ADF_Results').addClass('fade');
			},
// megkapjuk az eredmenyt			
			get: function(data){				
				$('#ADF_Loading').hide();
// eddigi talalatok homalyositas, torles				
				$('ul#ADF_Results').removeClass('fade').find('li').remove();
				
				if(data == 0){	//nincs
					if (ADF.lang == 'en'){
						$('ul#ADF_Results').append(ADF.no_result_tpl_en);
					} else {
						$('ul#ADF_Results').append(ADF.no_result_tpl);
					}
				} else {		//van, a JsTemplatekhez hozzarendeljuk, es betesszuk a listaba
					var content;
					for( var i in data.result ) {
						if (ADF.lang == 'en'){
							var template =  new JsTemplate.Template(ADF.result_tpl)
						} else {
							var template =  new JsTemplate.Template(ADF.result_tpl)
						}
						content = [content,template.run(data.result[i])].join('');						
					}
					$('ul#ADF_Results').append(content);

					var event = jQuery.Event("results_done");
					event.resultData = true;
					$('ul#ADF_Results').trigger(event);					
					
					this.pager.reset();
					if ( /*@cc_on!@*/false && (navigator['appVersion'].indexOf('MSIE 6') > 0)) {
						IEPNG.fix();
					}
				}
			},
			pager: {}
		};
		
	}();


	ADF.FormDisplay = function(){
	
		$(document).ready(function(){
			ADF.FormDisplay.init();
		});
		
		return {
			
			init: function(){

// legnagyobb fieldset magassagara beallitja az egesz formot
				var _f_max = 0;
				$('#ADF_ComplexSearch fieldset').each(function(){
					_f_max = max($(this)[0].offsetHeight,_f_max);
				})
				$('#ADF_ComplexSearch').css({
					height:_f_max,
					overflow: 'hidden'
				}).find('div.filter_group').css({height:_f_max});
				
				
				
				
// fieldsetek kezdeti pozicioja
				$('#ADF_ComplexSearch fieldset').css({
					position: 'absolute',
					top: 30
				}).each(function(i,s){
					$(this).css({
						left: i*617
					}).find('div:last-child').addClass('noborder');
				});
				
// fieldsetek animacioja
				$('#ADF_FilterMenu a').click(function(){					
					var left = $('#ADF_ComplexSearch').find('fieldset#'+$(this).attr('name')).css('left');
					$('#ADF_ComplexSearch fieldset').stop().animate({
						left: '-='+left
					},'fast');					
					$(this).siblings('.active').removeClass('active').end().addClass('active');
				});
				
// djuice checkboxok
				$('#ADF_ComplexSearch input.checkbox').each(function(){
					var k = new CustomCheckBox(this);
				})
// megjelenik a form
				$('#ADF_ComplexSearch').css('visibility','visible');
				
// dob egy esemenyt, hogy kesz a form, megjelenitesnel kellhet helper fuggvenyekhez				
				var event = jQuery.Event("ADF_ready");
				event.resultData = true;
				$('#ADF_ComplexSearch').trigger(event);			
				
// form reset click
				$('#ADF_Submit a#reset_btn').click(function(e){
					ADF.FormDisplay.reset();
					$(e).stopEvent();
					ADF.FormParser.send();
				})
				
			},
			success: function(){
				$('#ADF_ComplexSearch, #ADF_FilterMenu, #ADF_Submit').removeClass('fade');
			},		
			loading: function(){
				$('#ADF_ComplexSearch, #ADF_FilterMenu, #ADF_Submit').addClass('fade');
			},						
			reset: function(){
				$('#ADF_ComplexSearch fieldset input[type=checkbox]').removeAttr('checked').prev('span').find('b').removeClass('active')
			}
		};
		
	}();





var CustomCheckBox = function(_obj){
		var that = this;
		this.field = _obj;  
		this.element = document.createElement('span');
		this.element.className = 'custom_checkbox';
		this.element.innerHTML = '<b></b>';
			
		$(_obj).before(this.element).hide();
		
		if ($(this.field).attr('checked')) {
			$(this.element).find('b').addClass('active');
		}

		$(this.field).closest('label').click(function(e){
			$(e).stopEvent();
			that.handler();
		});
		$(this.element).click(function(e){
			$(e).stopEvent();
			that.handler();
		});
		

		}
	
	CustomCheckBox.prototype.handler = function(){

		if( $(this.field).attr('checked')) {
			
			$(this.field).removeAttr('checked');
			
			$(this.element).find('b').removeClass('active')
			
		} else {
			
			$(this.field).attr('checked',true)
			$(this.element).find('b').addClass('active')
			
			
		}
		
				
	}

var ResultPager = function( _selector, _items ){


		this.items = ADF.items_per_page;
		this.item = _items;
		this.container = $(_selector);
		this.count = this.container.find('> '+this.item).length;
		this.pages = Math.ceil( this.count / this.items );

		this.current=1;
		this.limit = 9;
		this.limit_current = 1;
		
		this.initialize();
	
		this.pager = this.displayPager();
	
		return this;
	}
	
	ResultPager.prototype.reset = function(){
		var that = this;
		$("div#ADF_Pager").remove();
		this.current = 1;
		this.count = this.container.find('> '+this.item).length;
		this.pages = Math.ceil( this.count / this.items );
		this.container.find('> '+this.item).each(function(i,s){
			if(i>=that.items){
				$(s).hide();
			}
		});
					
		this.pager = this.displayPager();
	}
	
	ResultPager.prototype.displayPager = function() {
		var that = this;
		if (ADF.lang == 'en'){
			var template =  new JsTemplate.Template(ADF.pager_tpl);
		} else {
			var template =  new JsTemplate.Template(ADF.pager_tpl);
		}
		var content = template.run({
			pages: this.pages
		});	
		this.container.after(content);
		
		if(this.pages < 10) {
			$("div#ADF_Pager .limit").hide();
		} else {
			$("div#ADF_Pager a:not(.all,.prev,.next,.limit)").eq(8).nextAll(':not(.all,.prev,.next,.limit.forward)"').hide();
			$("div#ADF_Pager a:not(.all,.prev,.next,.limit)").eq(0).addClass('active');
			$("div#ADF_Pager a.limit.back").hide();
		}
		
		$("div#ADF_Pager a:not(.all,.prev,.next,.limit)").click(function(){
			that.page(this.title)
		})
		
		$("div#ADF_Pager a.all").click(function(){
			that.container.find('> '+that.item).show();
		})		
		
		$("div#ADF_Pager a.prev, div#ADF_Pager a.next").click(function(){
			if(this.className == 'next' && that.current < that.pages ) {				
				that.page(that.current + 1)	
			} else if (this.className == 'prev' && that.current > 1 ) {
				that.page(that.current - 1);
			}
		});
		
		$("div#ADF_Pager a.limit").click(function(){
			if($(this).hasClass('forward') && that.limit_current < Math.ceil($("div#ADF_Pager a:not(.all,.prev,.next,.limit)").length/that.limit)) {
				

				that.limiter(+1);
				
				
			} else if ($(this).hasClass('back') && that.limit_current > 1 ) {
		
				that.limiter(-1);
			}
		});		
		
		return $("div#ADF_Pager");
		
	}	
	
	ResultPager.prototype.initialize = function() {
		
		var that = this;
		this.container.find('> '+this.item).each(function(i,s){
			if(i>=that.items){
				$(s).hide();
			}
		});
	}

	ResultPager.prototype.page = function( num ) {
		
		this.current = parseInt(num,10);
		$("div#ADF_Pager a:not(.all,.prev,.next,.limit)").removeClass('active');
		$("div#ADF_Pager a[title="+this.current+"]").addClass('active');
		
		var that = this;
		this.container.find('> '+this.item).each(function(i,s){
			if( i >= (num-1)*that.items && i < num*that.items ){
				$(s).show();
			} else {
				$(s).hide();
			}			
		});	
		
		/*
1 2 3 4 5 6 7 8 9 
10 11 12 13 14 15 16 17 18 
19 20 ...		
		*/
		if( this.current <= (this.limit_current-1)*this.limit && this.pages >= 10 ) {
			this.limiter(-1 )
		} else if (this.current > (this.limit_current)*(this.limit) && this.pages >= 10 ){
			this.limiter(1 )
		}
		

	}

	ResultPager.prototype.limiter = function(num){
	
		var that = this;
		
		
		
		this.limit_current = parseInt(num, 10)+this.limit_current;
		
		
		$("div#ADF_Pager a:not(.all,.prev,.next,.limit)").each(function(i, s){
			if (i >= (that.limit_current - 1) * that.limit && i < that.limit_current * that.limit) {
				$(s).show();
			}
			else {
				$(s).hide();
			}
		})
		
		$("div#ADF_Pager a.limit").show();
		
		if (Math.ceil($("div#ADF_Pager a:not(.all,.prev,.next,.limit)").length / this.limit) == this.limit_current) {
			$("div#ADF_Pager a.limit.forward").hide();
		} else {
			$("div#ADF_Pager a.limit.forward").show();
		}
		
		if (this.limit_current == 1) {
			$("div#ADF_Pager a.limit.back").hide();
		} else {	
			$("div#ADF_Pager a.limit.back").show();
		}
		this.page( (parseInt(num, 10) > 0)? (this.limit_current*9)-8:this.limit_current*9);

	}