(function($) {
	/**
	 * Returns the given queryString with all the params with the given keys
	 * suppressed
	 */
	function queryRemove(queryString, keys) {
		var result = queryString.replace(
				new RegExp('[?&](?:' + keys.join('|') + ')=[^&]+', 'ig'), '')
				.replace(/^[?&]/, '');
		return result;
	}
	// prevent form submission
	$("form:not(.default)").live('submit', function(event) {
		event.preventDefault();
	});
	
	$.mysw = {
		temp : new Array(),
		ajaxPath : './ajax/',
		authenticated : false,
		responseData : null,
                showMessageOptions: {},
		doAction : function(remoteHandler, data, action, successHandler,
				errorHandler, sync) {
			if (data == null)
				data = {};

			data.from_url = window.document.location.href;
			if (action != null)
				data.action = action;

			var url = this.ajaxPath + remoteHandler;

			if (sync) {

				var XHR = $.ajax({
					async : false,
					cache : false,
					data : data,
					dataType : 'json',
					timeout : 4000,
					type : 'POST',
					url : url
				});
				return this.responseHandler($.parseJSON(XHR.responseText),
						successHandler, errorHandler);
			}

			return $.post(url, // + '?callback=?',
			data, function(response) {
				$.mysw.responseHandler(response, successHandler, errorHandler);
			}, 'jsonp');
		},
		responseHandler : function(response, successHandler, errorHandler) {
			if (!response.ok) {
				if (errorHandler != null && typeof (errorHandler) == 'function') {
					return errorHandler(response.errors, response.data);
				}
				return this.errorHandler(response.errors, response.data);
			} else {
				if (successHandler != null
						&& typeof (successHandler) == 'function') {
					successHandler(response.data);
				} else
					this.successHandler(response.data);
			}

			// support conversion tracking
			if (response.data && response.data.tracking_image != undefined) {
				var image = new Image;
				image.onerror = image.onload = function() {
					$.mysw.responseAction(response);
				};
				image.src = response.data.tracking_image;
				return;
			}

			return this.responseAction(response);
		},
		responseAction : function(response) {
			// handle redirect when needed
			if (response.redirect != null && response.redirect != "") {
				document.location.href = response.redirect;
				return true;
			}

			// handle redirect when needed
			if (response.newwindow) {
				// if (! window.open(response.newwindow, '', ''))
				return window.top.location.href = response.newwindow;
				return;
			}

			// handle refresh when needed
			if (response.reload) {
				var origin = document.location.protocol + '//'
						+ document.location.host;
				var queryString = queryRemove(document.location.search,
						[ 'dc' ]);
				var href = origin + document.location.pathname
						+ (queryString ? '?' : '') + queryString;
				document.location.href = href;
				return true;
			}

		},
		successHandler : function(data) {
			this.log(data);
			// default success handler code here.
		},
		errorHandler : function(errors) {
			this.log(errors);
			var errText = '';
			for ( var i in errors)
				errText += ' » ' + ((errors[i].desc != null) ? (errors[i].desc/*
																				 * +'
																				 * ('+errors[i].code+')'
																				 */) : errors[i].code) + '\n';
			alert(errText);
		},
		log : function(obj) {
			/*
			 * if(typeof(console) != 'undefined' && typeof(console.log) !=
			 * 'undefined') console.log(obj);
			 */
			// dont do anything.
		},
		waiting : function() {
			$('body').css('cursor', 'wait');
		},
		stopWaiting : function() {
			$('body').css('cursor', 'default');
		},
		doUpload : function(remoteHandler, data, action, fileInputId,
				successHandler, errorHandler) {
			if (data == null)
				data = {};

			if (action != null)
				data.action = action;

			$.ajaxFileUpload({
				url : this.ajaxPath + remoteHandler,
				data : data,
				secureuri : false,
				fileElementId : fileInputId,
				dataType : 'json',
				success : function(response, status, fileName) {
					eval('response = ' + response);
					if (response.data == null) {
						response.data = {
							originalFile : fileName
						};
					} else {
						response.data.originalFile = fileName;
					}
					$.mysw.responseHandler(response, successHandler,
							errorHandler);
				}
			});
		},
		utils : {
			showLogin : function(evt, callback) {
				if (evt != null)
					evt.preventDefault();
				$('#block-forgot').fadeOut('fast', function() {
					$('#block-login').fadeIn('normal', callback);
				});
			},
			showForgotPassword : function(evt, callback) {
				if (evt != null)
					evt.preventDefault();
				$('#block-login').fadeOut('fast', function() {
					$('#block-forgot').fadeIn('normal', callback);
				});
			},
			showAdvantages : function(evt, callback) {
				if (evt != null)
					evt.preventDefault();
				$('#block-register').fadeOut('fast', function() {
					$('#block-advantages').fadeIn('normal', callback);
				});
			},
			showRegister : function(evt, callback) {
				if (evt != null)
					evt.preventDefault();
				$('#block-advantages').fadeOut('fast', function() {
					$('#block-register').fadeIn('normal', callback);
				});
			},
			showDialinLoginError : function(evt, callback) {
				if (evt != null)
					evt.preventDefault();
				$('#dialin-login-input-ctnr').fadeOut('fast', function() {
					$('#dialin-login-error').fadeIn('normal', callback);
				});
			},
			showDialinLogin : function(evt, callback) {
				if (evt != null)
					evt.preventDefault();
				$('#dialin-login-error').fadeOut('fast', function() {
					$('#dialin-login-input-ctnr').fadeIn('normal', callback);
				});
			},
			showMessage : function(type, lasts, extendedOptions) {
				if (typeof lasts == 'undefined') {
					lasts = 0; // default
				}
				$('#message-' + type + '-popup .close').bind('click',
						function(evt) {
							evt.preventDefault();
							// we now allow a close button to close as many
							// stacked dialogs as
							// specified by an extra class like _2 or _5
							var classes = $(this).attr('class');
							var iTop = classes.match(/\b_(\d+)\b/);
							iTop = iTop ? (parseInt(iTop[1], 10)) : 1;
							$.dialog.close(undefined, iTop);
						});
                                var dialogOptions = {
                                    width : 530,
					height : 140,
					imageBtnClose : 'img/close.png',
					onOpen : function(current) {
						if (lasts > 0) {
							setTimeout(function() {
								$.dialog.close(current);
							}, lasts * 1000);
						}
					}
                                };
                                if ( typeof $.mysw.showMessageOptions === 'object' ) {
                                    $.extend(dialogOptions, $.mysw.showMessageOptions);
                                }
                                if ( typeof extendedOptions === 'object' ) {
                                    $.extend(dialogOptions, extendedOptions);
                                }
                                
				$('#message-' + type + '-popup').dialog(
                                        dialogOptions);
			}
		},
		actions : {
                        paymentOk : function() {
                            $.mysw.utils.showMessage('payment-success', 5);
                        },
			setLanguage : function() {
				var data = {
					'language' : $('#user-language').val()
				};
				$.mysw.doAction('wallet', data, 'switchLanguage');
			},
			setCountry : function() {
				var data = {
					'country' : $('#user-country').val()
				};
				$.mysw.doAction('wallet', data, 'switchCountry');
			},
			dialinLogin : function() {
				$('#dialin-login-error').fadeOut('fast');

				var form = $("#dialin-login");

				var pin = $('[input[name=pincode]', form).val();

				if (pin.length < 4 || !pin.match(/^[0-9]{4}$/)) {
					return false;
				}

				var arr = form.serializeArray();
				var data = {};
				for ( var i in arr)
					data[arr[i].name] = arr[i].value;

				$.mysw.doAction('dialin', data, 'login',
						$.mysw.handlers.dialinLoginSuccess,
						$.mysw.handlers.dialinLoginErrors, true);
			},
			walletLogin : function() {
				var arr = $("#frm_login").serializeArray();
				var data = {};
				for ( var i in arr)
					data[arr[i].name] = arr[i].value;

				$.mysw.doAction('wallet', data, 'login',
						$.mysw.handlers.walletLoginSuccess,
						$.mysw.handlers.walletLoginErrors);
			},
			walletForgotPassword : function() {
				var arr = $("#frm_forgot").serializeArray();
				var data = {};
				for ( var i in arr)
					data[arr[i].name] = arr[i].value;

				$.mysw.doAction('wallet', data, 'forgotPassword',
						$.mysw.handlers.walletForgotPasswordSuccess,
						$.mysw.handlers.walletForgotPasswordErrors);
			},
			walletRegister : function() {
				var data = {
					'termsAgreed' : $('#wallet-register-terms:checked').length
				};
				var arr = $("#frm_register").serializeArray();
				for ( var i in arr)
					data[arr[i].name] = arr[i].value;

				$.mysw.doAction('wallet', data, 'register',
						$.mysw.handlers.walletRegisterSuccess,
						$.mysw.handlers.walletRegisterErrors);
			},
			walletLogout : function() {
				$.mysw.doAction('wallet', {}, 'logout');
			},
			enterPartnerSite : function(btn) {
				if (btn == null || btn == 'undefined')
					return false;

				var data = {};
				if ($(btn).attr('rel')) {
					data.mode = 'chat';
					data.model = $(btn).attr('rel');
				}
				$.mysw.doAction('wallet', data, 'useCredits');
			},
			sendFeedback : function() {
				var data = {};
				data.overall = $('.reactie [name="overall"]:checked').val();
				data.notes = $('.reactie [name="notes"]').val();
				data.email = $('.reactie [name="email"]').val();
				$.mysw.doAction('wallet', data, 'sendFeedback', function() {
					$.mysw.utils.showMessage('feedback-sent-success', 3);
					$('#btn_feedback').click();
				});
			},
			changePassword : function() {
				var arr = $("#frm_changepwd").serializeArray();

				var data = {};
				for ( var i in arr)
					data[arr[i].name] = arr[i].value;

				$.mysw.doAction('wallet', data, 'changePassword',
						$.mysw.handlers.changePasswordSuccess,
						$.mysw.handlers.changePasswordErrors);
			}
		},
		handlers : {
			getPhoneOptionsSuccess : function(data) {
				$('#dialin-info').fadeOut(
						'fast',
						function() {
							$('#dialin-number').html(data.number);
							$('#dialin-flag').attr(
									'src',
									$('#dialin-flag').attr('src').replace(
											/\/[^\/]+(\.jpg|\.png|\.gif)$/i,
											'/' + data.countryCode + '$1'));
							$('#dialin-currency').html(data.currencyUnit);
							$('#dialin-tariff').html(data.tariff);
							$('#dialin-info').fadeIn('fast');
						});
			},
			getPhoneOptionsErrors : function(errors, data) {
				$.mysw.errorHandler(errors);
			},
			dialinLoginSuccess : function(data) {
				// auto redirect
			},
			dialinLoginErrors : function(errors, data) {
				// $.mysw.utils.showMessage('dialin-login-failure', 5);
				$.mysw.utils.showMessage('dialin-login-failure');
			},
			walletLoginSuccess : function(data) {
				// auto redirect
			},
			walletLoginErrors : function(errors, data) {
				// $.mysw.utils.showMessage('wallet-login-failure', 5);
				$.mysw.utils.showMessage('wallet-login-failure');
			},
			walletRegisterSuccess : function(data) {
				$.mysw.utils.showMessage('wallet-register-success');
				$.mysw.utils.showAdvantages();
			},
			walletRegisterErrors : function(errors, data) {
				var type = errors[0].code.replace(/_not_valid$/, '');
				$.mysw.utils.showMessage('wallet-register-failure-' + type);
			},
			walletForgotPasswordSuccess : function(data) {
				$.mysw.utils.showMessage('forgot-password-success');
				$.mysw.utils.showLogin();
			},
			walletForgotPasswordErrors : function(errors, data) {
                                if(errors[0].code == 'forgot_to_many_times') {
                                    $.mysw.utils.showMessage('forgot-password-failure-many');
                                } else {
                                    $.mysw.utils.showMessage('forgot-password-failure');
                                }
			},
			changePasswordSuccess : function(data) {
				// if (data.message) alert(data.message);
				$.mysw.utils.showMessage('wallet-change-password-success');
			},
			changePasswordErrors : function(errors, data) {
				// $.mysw.errorHandler(errors);
				$.mysw.utils.showMessage('wallet-change-password-failure');
			}

		}
	};

})(jQuery);

