if (!this.counter_widget){

	var counter_widget = function(){

		return {

			counters : new Array(),

			build : function(obj){
				my_counter = new Object();
				my_counter.counter_id = counter_widget.counters.length;
				my_counter.timer = 0;
				my_counter.parameters = obj;
				if ( my_counter.parameters['baseName'] == '' || my_counter.parameters['baseName'] == undefined) {
					my_counter.parameters['baseName'] = 'counter';
				}
				if ( my_counter.parameters['timer'] == undefined ) {
					my_counter.parameters['timer'] = 1000;
				}
				if ( my_counter.parameters['increaseTitle'] == undefined ) {
					my_counter.parameters['increaseTitle'] = '';
				}
				if ( my_counter.parameters['decreaseTitle'] == undefined ) {
					my_counter.parameters['decreaseTitle'] = '';
				}
				my_counter.widget = $( 'div#' + my_counter.parameters['baseName'] + my_counter.parameters['parentID'] );
// 				var xy = $('div#cartcounter1').attr("id");
/*				alert(xy);
				alert('div#' + my_counter.parameters['baseName'] + my_counter.parameters['parentID']);*/
				if ( my_counter.widget == undefined ) {
					return false;
				}
				my_counter.operators = $('<span></span>').addClass('COUNTER-amountoperators');
				my_counter.aplus = $('<a></a>').addClass(
					'plus'
				).attr(
					'title',
					my_counter.parameters['increaseTitle']
				).attr(
					'href',
					'javascript:counter_widget.increase(' + my_counter.counter_id + ')'
				).html(
					'+'
				);
				my_counter.aminus = $('<a></a>').addClass(
					'minus'
				).attr(
					'title',
					my_counter.parameters['decreaseTitle']
				).attr(
					'href',
					'javascript:counter_widget.decrease(' + my_counter.counter_id + ');'
				).html(
					'-'
				);
				my_counter.operators.append( my_counter.aplus );
				my_counter.operators.append( my_counter.aminus );
				my_counter.widget.append(my_counter.operators);
				var amountAlertLabel = 'Please enter a quantity between 0 and 99.';
				my_counter.amount = $('<input type="text" />').attr(
					'id',
					'counteramount' + my_counter.parameters['baseName'] + my_counter.parameters['parentID']
				).attr(
					'name',
					'counteramount' + my_counter.parameters['baseName'] + my_counter.parameters['parentID']
				).bind(
					'blur',
					function(e){
						counter_widget.cancel_timer(my_counter.counter_id); counter_widget.change_counter(my_counter.counter_id);
					}
				).bind(
					'keydown',
					function(e){
						counter_widget.trigger_timer(my_counter.counter_id);
					}
				).bind(
					'keyup',
					function(e){
						restrictInputPattern('counteramount' + my_counter.parameters['baseName'] + my_counter.parameters['parentID'], /^[0-9]+$/, 2, amountAlertLabel, e);
					}
				).val(
					my_counter.parameters['value']
				);
				if ( my_counter.parameters['increaseAction'] == my_counter.parameters['decreaseAction'] ) {
					my_counter.waiting_time = 500;
					my_counter.timeout = false;
					my_counter.joined_timeout = true;
				}
				else {
					my_counter.waiting_time['increaseAction'] = 500;
					my_counter.waiting_time['decreaseAction'] = 500;
					my_counter.timeout['increaseAction'] = false;
					my_counter.timeout['decreaseAction'] = false;
					my_counter.joined_timeout = false;
				}
				my_counter.widget.append( my_counter.amount );
				this.counters[my_counter.counter_id] = my_counter;
				return true;
			},

			increase : function(counter_id){

				var amountAlertLabel = 'Please enter a quantity between 0 and 99.';
				var element = $('#counteramount' + this.counters[counter_id].parameters['baseName'] + this.counters[counter_id].parameters['parentID']);
				var amount = parseInt( element.val() ) + parseInt( this.counters[counter_id].parameters['step'] );
				if ( amount > this.counters[counter_id].parameters['maximum'] ) {
					amount = this.counters[counter_id].parameters['maximum'];
					alert( amountAlertLabel );
				}
				element.val(amount);

				if ( this.counters[counter_id].parameters['increaseAction'] ) {
					if ( this.counters[counter_id].joined_timeout ) {
						clearTimeout(this.counters[counter_id].timeout);
						var incFunc = this.counters[counter_id].parameters['increaseAction'];
						this.counters[counter_id].timeout = setTimeout(
							function(){
								eval(incFunc)
							},
							this.counters[counter_id].waiting_time
						);
					}
					else {
						clearTimeout(this.counters[counter_id].timeout['increaseAction']);
						var incFunc = this.counters[counter_id].parameters['increaseAction'];
						this.counters[counter_id].timeout['increaseAction'] = setTimeout(
							function(){
								eval(incFunc)
							},
							this.counters[counter_id].waiting_time['increaseAction']
						);
					}
				}

			},

			decrease : function(counter_id){

				var amountAlertLabel = 'Please enter a quantity between 0 and 99.';
				var element = $('#counteramount' + this.counters[counter_id].parameters['baseName'] + this.counters[counter_id].parameters['parentID']);
				var amount = parseInt( element.val() ) - parseInt( this.counters[counter_id].parameters['step'] );
				if ( amount < this.counters[counter_id].parameters['minimum'] ) {
					amount = this.counters[counter_id].parameters['minimum'];
					alert( amountAlertLabel );
				}
				element.val(amount);

				if ( this.counters[counter_id].parameters['decreaseAction'] ) {
					if ( this.counters[counter_id].joined_timeout ) {
						clearTimeout(this.counters[counter_id].timeout);
						var decFunc = this.counters[counter_id].parameters['decreaseAction'];
						this.counters[counter_id].timeout = setTimeout(
							function(){
								eval(decFunc)
							},
							this.counters[counter_id].waiting_time
						);
					}
					else {
						clearTimeout(this.counters[counter_id].timeout['decreaseAction']);
						var decFunc = this.counters[counter_id].parameters['decreaseAction'];
						this.counters[counter_id].timeout['decreaseAction'] = setTimeout(
							function(){
								eval(decFunc)
							},
							this.counters[counter_id].waiting_time['decreaseAction']
						);
					}
				}
			},

			change_counter : function(counter_id){

				var amountAlertLabel = 'Please enter a quantity between 0 and 99.';
				element = $('#counteramount' + this.counters[counter_id].parameters['baseName'] + this.counters[counter_id].parameters['parentID']);
				amount = parseInt( element.val() );
				if ( amount > this.counters[counter_id].parameters['maximum'] ) {
					amount = this.counters[counter_id].parameters['maximum'];
					alert( amountAlertLabel );
				}
				if ( amount < this.counters[counter_id].parameters['minimum'] ) {
					amount = this.counters[counter_id].parameters['minimum'];
					alert( amountAlertLabel );
				}

				if ( this.counters[counter_id].parameters['inputAction'] ) {
					eval( this.counters[counter_id].parameters['inputAction'] );
				}

			},

			trigger_timer : function(counter_id){

				this.counters[counter_id].timer = setTimeout(
					function(){
						counter_widget.change_counter(counter_id)
					},
					this.counters[counter_id].parameters['timer']
				);

			},

			cancel_timer : function(counter_id){

				clearTimeout( this.counters[counter_id].timer );

			}

		};

	}();

}

