﻿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();
		});
	}
	
	,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)\d{7}|30(800|801|806|812|825)\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.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: "{}"
            ,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, '');}