﻿var MyViva =
{

	_invalidPostBackButtons: []
	,_animationExtenders: []
	,_entity: null

	,_online: null
	,_baseUrl: null
	,_imageUrl: null
	,_returnUrl: null
	,_siteUrl: null
	
	,requestType:
	{
		balance: 'Balance'
		,pending: 'Pending'
		,pendingItemCount: 'PendingItemCount'
		,pendingItemDetails: 'PendingItemDetails'
	}
	
	,dataValueType:
	{
		text: 'text'
		,json: 'json'
	}
	
	,get_currentBalance: function(){return Balance.get_currentBalance();}
	
	,get_globals: function()
	{
		var v =
		{
			online: this.get_online()
			,baseUrl: this.get_baseUrl()
			,imageUrl: this.get_imageUrl()
			,returnUrl: this.get_returnUrl()
			,siteUrl: this.get_siteUrl()
		}
		
		return v;
	}
	
	,set_globals: function(values)
	{
		this.set_online(values.online);
		this.set_baseUrl(values.baseUrl);
		this.set_imageUrl(values.imageUrl);
		this.set_returnUrl(values.returnUrl);
		this.set_siteUrl(values.siteUrl);
	}
	
	,get_online: function(){return this._online; }
	,set_online: function(value){this._online = value;}
	
	,get_siteUrl: function(){return this._siteUrl;}
	,set_siteUrl: function(value){this._siteUrl = value;}
	
	,get_baseUrl: function(){return this._baseUrl;}
	,set_baseUrl: function(value){this._baseUrl = value;}
	
	,get_imageUrl: function(){return this._imageUrl;}
	,set_imageUrl: function(value){this._imageUrl = value;}
	
	,get_returnUrl: function(){return this._returnUrl;}
	,set_returnUrl: function(value){this._returnUrl = value;}
	
	,get_invalidPostBackButtons: function(){return this._invalidPostBackButtons;}
	,set_invalidPostBackButtons: function(value){this._invalidPostBackButtons = value;}
	
	,get_animationExtenders: function(){return this._animationExtenders;}
	,set_animationExtenders: function(value){this._animationExtenders = value;}
	
	,get_Entity: function(){return this._entity;}
	,set_Entity: function(value){this._entity = value;}
	
	,add_invalidPostBackButton: function(button){this._invalidPostBackButtons.push(button);}
	,add_animationExtender: function(animation){this._animationExtenders.push(animation);}
	
	,set_Cookie: function(name, value){setCookie(name, value);}
	,get_Cookie: function(name){return getCookie(name);}
	
	,initialize: function(callback, windowCallback)
	{
		// handle ajax
		this.handleAjaxErrors();
		
		$(document).ready(function()
		{
			// Preload images
			// ImagePreloader();
			fixPNG();
			
			if(typeof(callback) == 'function')
				callback();
		});
		
		// Fix corners
		$(window).load(function()
		{
			// fix layout
			footer();
			fixPNG();
			initCorners();
			
			// get whoson availability
			MyViva.showWhosOnAvailability();
			
			if($my.get_online())
			{
				setPaymentsMenu();
				//setUserSettingsMenu();
			}
		});
	}
	
	,findPendingItems: function()
	{
		// find if user has any pending items
		MyViva._getDataValue(MyViva.requestType.pending, MyViva.dataValueType.text, function(value)
		{
			// if we have panding items then show link
			if(value.toString() == '1')
			{
				$('a[id$=PendingNumbersLink]:first')
					.attr('href', '/Numbers/PendingNumbers.aspx')
					.attr('title', 'Δείτε τις εκκρεμότητες σας')
					.attr('class', 'loginPendingNumbersEnabled');
			}
		});
	}

	,updatePoints: function()
	{
		Balance._query()
	}
	
	,handleAjaxErrors: function()
	{
		if(typeof(Sys) == 'object')
			Sys.WebForms.PageRequestManager.getInstance().add_endRequest(_errorHandler);
	}
	
	,showWhosOnAvailability: function()
	{
		$.ajax(
		{
			type: "GET"
			,url: "/WhosOn.ashx?url=" + escape(location.pathname)
			,data: "{}"
			,contentType: "application/json; charset=utf-8"
			,dataType: "text"
			,success: function(value)
			{
				// Save current balance
				var ws = $('a[whoson=true]:first');
				var isOnline = (value == '1');
				ws.attr('disabled', !isOnline)
				if(!isOnline)ws.attr('href', 'javascript:');
			}
			,error: function(xht, status, err)
			{
				// Pass only status message
				//alert('WhosOn status: ' + status);
			}
		});
	}
	
	,handleAjaxLoader: function(options, beginRequest, endRequest)
	{
		if(options == null || typeof(options) == 'undefined')
			options =
			{
				message: $('<div id="_spinner" style="display: none;"><img src="/images/sp.gif" border="0" /></div>')
				,css: {border: '0px'}
				,baseZ: 1000001
			};

		// get form manager
		var prm = Sys.WebForms.PageRequestManager.getInstance();
		
		// Handle all ajax requests
		prm.add_beginRequest(function(sender, args)
		{
			$.blockUI(options);
			
			if(typeof(beginRequest) == 'function')
				beginRequest(sender, args);
		});
		
		// Handle all end requests
		prm.add_endRequest(function()
		{
			$.unblockUI();
			
			if(typeof(endRequest) == 'function')
				endRequest();
		});
	}
	
	,handleElementAjaxLoader: function(options)
	{
		var config =
		{
			element: null
			,_options:
			{
				message: null
				,css:
				{
					border: 0
				}
			}
			,onBeginRequest: null
			,onEndRequest: null
		}
		
		$.extend(config, options);
		
		var prm = Sys.WebForms.PageRequestManager.getInstance();

		prm.add_beginRequest(function(sender, args)
		{
			$(config.element).block(config._options);
			if(typeof(config.onBeginRequest) == 'function')
				config.onBeginRequest(sender, args);
		});
		
		prm.add_endRequest(function()
		{
			$(config.element).unblock();
			if(typeof(config.onEndRequest) == 'function')
				config.onEndRequest();
		});
	}
	
	,isInvalidPostBack: function(button)
	{
		var entity = this.get_Entity();
		return (Array.indexOf(this.get_invalidPostBackButtons(), button) > -1 && entity != null && entity.get_Updating());
	}
	
	,cancelAnimations: function()
	{
		var animations = this.get_animationExtenders();
		if(animations.length > 0)
		{
			for(var i in animations)
			{
				var ext = $find(animations[i]);
				if(ext != null)
					ext.get_OnUpdatingBehavior().quit();
			}
		}
	}
	
	,handleInvalidPostbacks: function()
	{
		$addHandler(window, 'load', function()
		{
			Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(function (sender, args) 
			{
				// Get postback button id
				var _button = args.get_postBackElement().id;
				
				// If it's an invalid postback
				if(MyViva.isInvalidPostBack(_button))
				{
					// Stop all animations
					MyViva.cancelAnimations();
					
					// Set entity update status to false
					var entity = MyViva.get_Entity();
					if(entity != null)
					{
						entity.set_Updating(false);
						entity.update();
					}
				}
			});
		});
	}
	
	,shake: function(n)
	{
		if(parent.moveBy)
		{
			for(var i = 10; i > 0; i--)
			{
				for(var j = n; j > 0; j--)
				{
					try
					{
						parent.moveBy(0, i);
						parent.moveBy(i, 0);
						parent.moveBy(0, -i);
						parent.moveBy(-i, 0);
					}
					catch(ex){}
				}
			}
		}
	}
	
	,_getDataValue: function(requestType, dataType, success, failure)
	{
		$.ajax(
		{
			type: "GET"
			,url: String.format("/MyViva/User-{0}.ashx", requestType)
			,data: "{}"
			,contentType: "application/json; charset=utf-8"
			,dataType: dataType
			,success: success
			,error: failure
		});
	}
	
}

var _Validators =
{

	is_validPhoneNumber: function(number)
	{
	
		var patterns =
		{
			number: new RegExp(/^\d{7,25}/)
			,local: new RegExp(/^(2\d{9}|302\d{9}|(69|70)\d{8}|30(69|70)\d{8}|(800|801|806|812|825|850|875)\d{7}|30(800|801|806|812|825|850|875)\d{7})$/)
		}
		
		var valid = false;

		if (patterns.number.test(number))
		{
			if(number.startsWith('00'))
			{
				if(number.startsWithRange(['00302', '00306']) && number.substring(5).length == 9)
					valid = true;
				else if(number.startsWithRange(['00302', '00306']) && number.substring(5).length != 9)
					valid = false;
				else if(number.startsWithRange(['0030801', '0030800']) && number.substring(7).length == 7)
					valid = true;
				else if(number.startsWithRange(['0030801', '0030800']) && number.substring(7).length != 7)
					valid = false;
				
				else if(number.startsWithRange(['0030806', '0030812']) && number.substring(7).length == 7)
					valid = true;
				else if(number.startsWithRange(['0030806', '0030812']) && number.substring(7).length != 7)
					valid = false;
				 
				else if(number.startsWithRange(['0030825']) && number.substring(7).length == 7)
					valid = true;
				else if(number.startsWithRange(['0030825']) && number.substring(7).length != 7)
					valid = false;
					
				else if(number.startsWithRange(['0030850']) && number.substring(7).length == 7)
					valid = true;
				else if(number.startsWithRange(['0030850']) && number.substring(7).length != 7)
					valid = false;
					
				else if(number.startsWithRange(['0030875']) && number.substring(7).length == 7)
					valid = true;
				else if(number.startsWithRange(['0030875']) && number.substring(7).length != 7)
					valid = false;
				
				else if(number.startsWith('00700700') && number.substring(8).length == 4)
					valid = true;
				else if(number.startsWith('00700700') && number.substring(8).length != 4)
					valid = false;
				else if(number.substring(2).length >= 9)
					valid = true;
				else
					valid = false;
			}
			else 
			{
				valid = patterns.local.test(number);
			}
		}
		
		return valid;
		
	}
	
	,is_email: function(email)
	{
		var supported = 0;
		var result = false;
		
		if(window.RegExp)
		{
			var tempStr = "a";
			var tempReg = new RegExp(tempStr);
			if (tempReg.test(tempStr)) supported = 1;
		}
		
		if (!supported) 
			result = (email.indexOf(".") > 2) && (email.indexOf("@") > 0);
		else
		{
			var r1 = new RegExp("(@.*@)|(\\.\\.)|(@\\.)|(^\\.)");
			var r2 = new RegExp("^.+\\@(\\[?)[a-zA-Z0-9\\-\\.]+\\.([a-zA-Z]{2,3}|[0-9]{1,3})(\\]?)$");
			result = (!r1.test(email) && r2.test(email));
		}
		
		return(result);
	}
	
	,is_vat: function(value)
	{
		var valid = false;

		if(value.match(/[^0-9]/g) > 0 || value.length != 9)
			valid = false;
		else
		{
			var total = 0;
			
			for(var i = 0; i < 8; i++)
				total += value.substr(i, 1) * (1 << (9 - i - 1));

			valid = true;
			
			if (!(((total % 11) % 10) == value.substr(9 - 1)) || (value == "000000000"))
				valid = false;
		}
		
		return(valid);
	}
	
	,is_identity: function(value)
	{
		var valid = false;
		
		var r = new RegExp(/^[Α-Ω]{1,2}[0-9]{6}$/);

		valid = r.test(value.toUpperCase());
		
		return(valid);
	}
	
	,customValidators: {}
};


_Validators.customValidators =
{
	validateEmail: function(sender, args)
	{
		args.IsValid = _Validators.is_email(args.Value);
	}
	
	,validatePhoneNumber: function(sender, args)
	{
		args.IsValid = _Validators.is_validPhoneNumber(args.Value);
	}
	
	,validateVAT: function(sender, args)
	{
		args.IsValid = _Validators.is_vat(args.Value);
	}
	
	,validateIdentity: function(sender, args)
	{
		args.IsValid = _Validators.is_identity(args.Value);
	}
}

var Balance =
{
	_balance: null
	,_elementId: '___balance'
	,_stylizer: '_stylizer'
	,_interval: 30000
	,_display: false
	,_currentBalance: null
	
	,set_interval: function(value){this._interval = value;}
	,get_interval: function(){return this._interval;}
	
	,set_display: function(value)
	{
		this._display = value;
	}
	
	,get_display: function(){ return this._display; }
	
	,get_currentBalance: function(){return this._currentBalance;}
	,set_currentBalance: function(value)
	{
		/*if(isNaN(value))
		{
			$('#jqCloseButton').one('click',
			function()
			{
				_g('/Accounts/Login.aspx?returnUrl={0}'.Format(escape($my.get_returnUrl())));
			});
			
			_alert('Για τη δική σας ασφάλεια έχετε αποσυνδεθεί από το Viva.gr');
			Balance.stop();
		}
		else
		{
		*/
			var previous = this._currentBalance;
			this._currentBalance = value;
			
			var stylizer = $('div[id$='+ this._stylizer +']');

			//Reset background style
			stylizer.removeClass();

			//Set background style
			if (value > 0)
				stylizer.addClass('pointsok');
			else if (value < 0)
				stylizer.addClass('pointsnotok');
			
			if(previous != value && typeof(this.balanceChanged) == 'function')
				this.balanceChanged();
		/*}*/
	}
	
	,balanceChanged: null
	
	,start: function()
	{
		if(this.get_display())
			this._balance = setTimeout(Balance._query, this.get_interval());
	}
	
	,stop: function()
	{
		this.set_display(false);
		window.clearTimeout(this._balance);
	}
	
	,_query: function()
	{
		$.ajax(
		{
			type: "GET"
			,url: "/MyViva/Balance.ashx"
			,data: null
			,contentType: "application/json; charset=utf-8"
			,dataType: "json"
			,success: function(balance)
			{
				// Save current balance
				Balance._success(balance);
			}
			,error: function(xht, status, err)
			{
				// Pass only status message
				Balance._failure(status);
			}
		});
	}
	
	,_success: function(value)
	{
		var current = Number._parse((value.b == 0 ? value.v : value.p), Sys.CultureInfo.CurrentCulture);
		var balance = (value.b == 0 ? value.v : String.format('{0} - {1}', value.p, value.f));
		
		this.set_currentBalance(current);
		var element = $('#' + this._elementId).find('div');
		element.find('span').each(function(index)
		{
			$(this).show();
			$(this).html((index == 0 ? balance : (current == 1 ? 'Point' : 'Points')));
			$(this).attr('title', balance + (parseInt(current) == 1 ? ' Point' : ' Points'));
		});
		
		element.attr('title', function(){return element.find('span:first').attr('title');});
		element.find('span:first').width('auto');
		element.width(element.find('span:first').width() + 39);
		
		// Fire again
		this.start();
	}
	
	,_failure: function(value)
	{
		// this.start();
		// _alert(value);
	}
};

// Register validators
MyViva.validators = _Validators;

// Cache my viva
var $my = MyViva;

// keep validators also here as a shortcut
var $validators = _Validators;

String.prototype.isEmail = function(){return $my.validators.is_email(this);}
String.prototype.isPhoneNumber = function(){return $my.validators.is_validPhoneNumber(this);}
String.prototype.isVat = function(){return $my.validators.isVat(this);}
String.prototype.removeNonNumeric = function(){return this.replace(/\D/gi, '');}
String.removeNonNumeric = function(value){return value.replace(/\D/gi, '');}
