﻿var Numbers =
{
    _list: null
    
    ,get_list: function(){return this._list;}
    ,set_list: function(value){this._list = value;}
    
    ,exists: function(value)
    {
        var ok = false;
        
        for(var i = 0; i < this._list.length; i++)
        {
            if(this._list[i].number == value)
            {
                ok = true;
                break;
            }
        }
        
        return ok;
    }
    
    ,has_personNumbers: function()
    {
        var has_personal = false;
        for(var i = 0; i < this._list.length; i++)
        {
            if(this._list[i].personal)
            {
                has_personal = true;
                break;
            }
        }
        
        return has_personal;
    }
    
    ,get_selected: function(number)
    {
        var selected = null;
        
        for(var i = 0; i < this._list.length; i++)
        {
            if(this._list[i].number == number)
            {
                selected = this._list[i].selected;
                break;
            }
        }
        
        return(selected);
    }
    
    ,set_selected: function(number, selected)
    {
        for(var i = 0; i < this._list.length; i++)
        {
            if(this._list[i].number == number)
            {
                this._list[i].selected = selected;
                break;
            }
        }
    }
    
    ,get_availableCount: function()
    {
        var count = 0;
        
        for(var i = 0; i < this._list.length; i++)
        {
            if(!this._list[i].selected)
                count++;
        }
        
        return count;
    }
    
    ,changeSelection: function(oldValue, newValue)
    {
        this.set_selected(oldValue, false);
        this.set_selected(newValue, true);
    }
}

var $fm = FollowMe =
{
    _tableElementId: '#followme_configuration'
    ,_sampleElementId: '#followme_sample'
    ,_emptyElementId: '#followme_empty'
    ,_configuration: null
    ,_phones: null
    ,_rowCount: 1
    ,_maximumRowCount: 100000
    ,_moveToTabIndex: null
    ,_allowInternationalCalls: false
    ,_allow0030: false
    ,_isNoChargeNumber: false

	,get_allowInternationalCalls: function() { return this._allowInternationalCalls; }
	,set_allowInternationalCalls: function(value) { this._allowInternationalCalls = value; }
	
	,get_allow0030: function() { return this._allow0030; }
	,set_allow0030: function(value) { this._allow0030 = value; }
	
	,get_maximumRowCount: function(){return this._maximumRowCount;}
	,set_maximumRowCount: function(value){return this._maximumRowCount = value;}
	
	,get_isNoChargeNumber: function(){return this._isNoChargeNumber;}
	,set_isNoChargeNumber: function(value){this._isNoChargeNumber = value;}
	
	,debug: function()
	{
		var sb = new Sys.StringBuilder();
		for(var i = 0; i < Numbers.get_list().length; i++)
		{
			if(!sb.isEmpty())
				sb.append('\n');
			sb.append(Numbers.get_list()[i].number);
		}
		alert(sb.toString());
	}
	
	,debug2: function()
	{
		var sb = new Sys.StringBuilder();
		for(var i = 0; i < this.get_configuration().length; i++)
		{
			if(!sb.isEmpty())
				sb.append('\n');
			sb.append(this.get_configuration()[i].number);
		}
		alert(sb.toString());
	}

	,validate: function()
	{
		var isValid = true;
		
		if($(this._tableElementId).size() > 0)
		{
			var rows = $(this._tableElementId).find('tr').get()
			var error_message = null;
			
			for(var i = 0; i < rows.length; i++)
			{
				var row = $(rows[i]);
				
				if(i > 2)
				{
					var value = row.find('td:first').find('input:first').val();
					if(value.trim().length == 0)
					{
						isValid = false;
						error_message = 'Συμπληρώστε όλα τα τηλέφωνα ή διαγράψτε τις κενές γραμμές';
					}
					else if(!is_allowed_number(value.trim()))//!$validators.is_validPhoneNumber(value.trim()))
					{
						isValid = false;
						error_message = 'Συμπληρώστε σωστά όλα τα τηλέφωνα.';
					}
					else
					{
						if(value.startsWith('00') && !FollowMe.get_allowInternationalCalls() && !value.startsWith('0030'))
						{
							isValid = false;
							error_message = 'Για λόγους αποτροπής κακόβουλων ενεργειών, η δυνατότητα εκτροπής σε νούμερο εξωτερικού είναι απενεργοποιημένη αρχικά σε κάθε Viva Number.' +
											' Για να σας ενεργοποιήσουμε αυτήν την δυνατότητα χωρίς κάποια χρέωση για εσάς, παρακαλώ καλέστε 13855 από Ελλάδα ή +30 211 7700 000.';
									
						}
						if (value.startsWith('0030') && !FollowMe.get_allow0030())
						{
							isValid = false;
							error_message = 'Παρακαλώ εισάγετε τα νούμερα εσωτερικού χωρίς το πρόθεμα 0030.';
						}
					}
				}
			//});
			
				if(!isValid)
					break;
			}
			
			// Perform this validation only if we have a no charge number
			if(!isValid)
				_alert(error_message);
			else
			{
				if(this.get_isNoChargeNumber() && this.get_rowCount() == 1)
				{
					var value = $(this._tableElementId).find('tr').eq(3).find('td:first').find('input:first').val();
					var r = new RegExp(/2[0-9]{9}/);
					if(!r.test(value))
					{
						isValid = false;
						_alert('Μπορείτε να προσθέσετε μόνο γεωγραφικούς αριθμούς');
					}
				}
			}
		}
		
		return isValid;
	}

    ,newLine: function(values)
    {
		if(this.get_rowCount() < this.get_maximumRowCount())
		{
			if (this.Numbers.get_availableCount() > 0)
			{
				if (values == null || typeof (values) == 'undfined')
					values = { number: null, priority: 0, timeout: 15, enabled: 1 };

				if(values.number == null || 1 == 1)// || this.Numbers.exists(values.number))
				{
					this.emptyLineVisible(false);
	                
					// Create a new row
					var row = $(this._sampleElementId).clone().css('display', '').attr('nm', 'true').attr('id', '');
					$(this._tableElementId).find('tbody').append(row);

					var count = this._rowCount++;

					row.find('td').eq(0)
						.find('input:text')
						.attr(
						{
							id: 'phoneselect' + count
							,name: 'phoneselect' + count
						}).val((values.number == null ? '' : values.number)).blur(function(){this.value = String.removeNonNumeric(this.value);}).blur();
	                    
					$.fx.off = true;
//					row.find('td').eq(0).find('div[class=dropdown-wrapper]').dropdown(
//					{
//						list: FollowMe.Numbers
//						,valueChanged: function(oldValue, newValue)
//						{
//							FollowMe.Numbers.changeSelection(oldValue, newValue);
//						}
//						,onDelete: function(value)
//						{
//							FollowMe.Numbers.set_selected(value, false);
//						}
//					});
	                
					var tabs = $find($('div[id$=NymberTabs]').attr('id'));
					var active = tabs.get_activeTabIndex();
					//alert(active + ' - ' + this._moveToTabIndex);
					if(active != 0)
					{
						this._moveToTabIndex = active;
						tabs.set_activeTabIndex(0);
					}
	                
					var exp = (values.number != null ? 'li[phone=' + values.number.trim() + ']' : 'li:first');
					row.find('td').find('div[class=dropdown-wrapper]').click().find(exp).click();
					$.fx.off = false;
	                
					row.find('td').eq(1)
						.find('input:hidden')
						.attr({ id: 'priority' + count, name: 'priority' + count }).attr('value', values.priority)
						.parent().find('img').each(function(index)
						{
							if (index == 0) // down
								this.style.visibility = (count > 0 ? 'visible' : 'hidden');
							else
								this.style.visibility = (count > 1 ? 'visible' : 'hidden');
						});
	                
					row.find('td').eq(2).find('select:first')
						.attr({ id: 'timeout' + count, name: 'timeout' + count }).attr('value', values.timeout);

					row.find('td').eq(3).find('input:checkbox')
						.attr({ id: 'enabled' + count, name: 'enabled' + count }).attr('checked', values.enabled);//.triggerHandler('click');
					FollowMe.toggleEnabled(row.find('td').eq(3).find('input:checkbox').get(0));

					row.find('td:last').find('img').click(function(event)
					{
						// Get current phone
						var phoneId = $('input:hidden[id$=MyNumbers]').attr('value');

						// Get row phone
						var destination = $(this).parent().parent().find('td:first').find('input:first').attr('value');
						if(destination.length == 0)
							alert('Συμπληρώστε τον αριθμό')
						else
						{
							// Get cost
							FollowMe._getCallCost(event, this, phoneId, destination);
						}
					});

					// Re order
					this._layoutImages();
					this._fixPriority();
					
					// create auto complete
					_autocomplete(_phones);
				}
			}
			else
			{
				_alert('Δεν μπορείτε να προσθέσετε άλλες γραμμές γιατί δεν έχετε δηλώσει άλλους αριθμούς. Εισάγετε νέους προσωπικούς αριθμούς, πατώντας στην "Διαχείριση Αριθμών"');
			}
		}
		else
			_alert('Δεν μπορείτε να προσθέσετε άλλες γραμμές');
    }

    ,deleteLine: function(caller)
    {
        if (confirm('Είστε σίγουρος / η ότι θέλετε να διαγράψετε τη γραμμή ;'))
           this._removeLine(caller.parentNode.parentNode);
    }

    ,toggleEnabled: function(caller)
    {
        var row = $(caller.parentNode.parentNode);
        var cssClass = (caller.checked ? 'mn_Grid_Row' : 'mn_Grid_Row_Disabled');
        row.attr('class', cssClass).find('td').attr('class', cssClass);
    }

    ,moveUp: function(caller)
    {
        var row = $(caller.parentNode.parentNode);
        var position = row.find('input:hidden').attr('value');

        row.insertBefore(row.prev());

        this._layout();
    }

    ,moveDown: function(caller)
    {
        var row = $(caller.parentNode.parentNode);
        var position = row.find('input:hidden').attr('value');

        row.insertAfter(row.next());

        this._layout();
    }

    ,clear: function()
    {
		var fm = this;
        $(this._tableElementId).find('tr[nm=true]').each(function(index)
        {
			fm._removeLine(this);
        });
    }

    ,emptyLineVisible: function(value)
    {
        $(this._emptyElementId).css('display', (value ? '' : 'none'));
        if($(this._emptyElementId).css('display') != 'none')
        {
            $('#no_personal_numbers').css('display', (Numbers.has_personNumbers() ? 'none' : ''));
            $('#no_follow_me').css('display', (Numbers.has_personNumbers() ? '' : 'none'));
            
            if($('#no_personal_numbers').css('display') != 'none'
                && $('#no_follow_me').css('display') != 'none')
                $('#no_follow_me').css('margin', '4px 0px 0px 0px');
            else
                $('#no_follow_me').css('margin', '0px');
        }
    }

    ,get_rowCount: function()
    {
        return ($get(this._tableElementId.substring(1)).rows.length - 3);
    }

    ,get_phones: function() { return this._phones; }
    ,set_phones: function(value) { this._phones = value; }

    ,get_configuration: function() { return this._configuration; }
    ,set_configuration: function(value) {this._configuration = value; }

    ,applyConfiguration: function()
    {
        var tabs = $find($('div[id$=NymberTabs]').attr('id'));
        if(tabs != null && tabs.get_isInitialized())
        {
            FollowMe._applyConfiguration();
            //FollowMe.sequence();
        }
        else
            setTimeout("FollowMe.applyConfiguration()", 100);
    }
    
    ,sequence: function()
    {
        var value = $('table[id$=FollowMeInfoSequence]').find('input[checked=true]').val();
        $(this._tableElementId).find('th[timeout=true],td[timeout=true]').css('display', (value == 1 ? '' : 'none'));
        // $('#voicemailcongifholder').css('display', (value == 1 ? '' : 'none'));
        $('#globaltimeoutholder').css('display', (value == 2 ? '' : 'none'));
    }
    
    ,_removeLine: function(row)
    {
		var v = $(row).find('td:first').find('input:hidden').attr('value');

        // Release number
        FollowMe.Numbers.set_selected(v, false);

        $(row).remove();

        if (this.get_rowCount() == 0)
            this.emptyLineVisible(true);
        else
            this._layout();
    }
    
    ,_applyConfiguration: function()
    {
        this.clear();
        this._moveToTabIndex = null;

        if (this._configuration != null)
        {
            for (var i = 0; i < this._configuration.length; i++)
                this.newLine(this._configuration[i]);
        }
        
        if(this._moveToTabIndex != null)
        {
            var tabs = $find($('div[id$=NymberTabs]').attr('id'));
            tabs.set_activeTabIndex(this._moveToTabIndex);
            
            this._moveToTabIndex = null;
        }
        
        if(this.get_rowCount() == 0)
            this.emptyLineVisible(true);
    }

    ,_dropdownValues: function(drop)
    {
        for (var i = 0; i < this._phones.length; i++)
        {
            var phone = this._phones[i];
            drop.options[drop.options.length] = new Option(phone.description, phone.number);
        }
    }

    ,_layout: function()
    {
        this._layoutImages();
        this._fixPriority();
    }

    ,_layoutImages: function()
    {
        var count = this.get_rowCount();
        $(this._tableElementId).find('tr[nm=true]').each(function(index)
        {
            $(this).find('td').eq(1).find('img').eq(0).css('visibility', 'visible');
            $(this).find('td').eq(1).find('img').eq(1).css('visibility', (count > 0 ? 'visible' : 'hidden'));
        });

        if (count > 1)
            $(this._tableElementId).find('tr[nm=true]:last').find('img[direction=down]').css('visibility', 'hidden');
        $(this._tableElementId).find('tr[nm=true]:first').find('img[direction=up]').css('visibility', 'hidden');
    }

    ,_fixPriority: function()
    {
        $(this._tableElementId).find('tr[nm=true]').each(function(index)
        {
            $(this).find('td').eq(1).find('input:hidden').attr('value', index + 1);
        });
    }

    ,_getCallCost: function(event, element, numberId, destination)
    {
        var ev = event;
        $.ajax(
	    {
	        type: "POST"
		    //,url: window.location.pathname + '/GetCallCostDetails'
		    ,url: '/Numbers/NumberConfig.aspx/GetCallCostDetails'
		    ,data: "{'numberId':'" + numberId + "','destination':'" + destination + "'}"
		    ,contentType: "application/json; charset=utf-8"
		    ,dataType: 'json'
		    ,success: function(result)
		    {
		        
		        var values = result.d.split('|');
		        var message = new Sys.StringBuilder();

                if ($('div[id$=MyNumbers_div].textdropdown-box-green').text().startsWith('800'))
                {
                    message.append('Για την εκτροπή στο συγκεκριμένο νούμερο και εφόσον απαντήσετε την κλήση, ');
	                message.append('η χρέωση είναι <b>4 Points/λεπτό (0,04 €/λεπτό)</b> για εισερχόμενες <b>από σταθερά Ελλάδος</b> ');
	                message.append('και <b>36 Points/λεπτό (0,36 €/λεπτό)</b> για εισερχόμενες <b>από κινητά Ελλάδος</b>.');
                }
                else
                {
		            if (values[3] == 'False')
		            {
		                message.append('Για την εκτροπή στο συγκεκριμένο νούμερο και εφόσον απαντήσετε την κλήση, ');
		                message.append('η χρέωση είναι <b>{0} Point(s)/λεπτό '.Format(values[0]));
		                message.append('(ή {0} €/λεπτό)</b>.<br /><br />'.Format(values[2]));
		                message.append('Με βάση τα Points που έχετε διαθέσιμα, ο χρόνος ομιλίας είναι <b>{0}</b> λεπτά.'.Format(values[1]));
		            }
		            else if (values[3] == 'True')
		            {
		               message.append('Η κλήση από αριθμό Viva προς αριθμό Viva είναι δωρεάν.');
		            }
		            else
		            {
		               message.append('Συμβουλευτείτε τον τιμοκατάλογο του Followme, για το κόστος εκτροπής στον συγκεκριμένο αριθμό.');
		            }
		        }
		        
		        tooltip.show(message, 'blue', 255, 'STATIC').position(ev);

		        $(element).one('mouseout', function() {
		            tooltip.hide();
		        });
		    }
		    ,error: function(result)
		    {
		        var details = 'Σφάλμα - Παρακαλώ δοκιμάστε ξανά';
		        var message = new Sys.StringBuilder();
		        message.append(details);
		        
		        tooltip.show(message, 'yellow', 250, 'STATIC').position(ev);

		        $(element).one('mouseout', function() {
		            tooltip.hide();
		        });
		    }
	    });
	    
	    event.stopPropagation();
    }
}

function is_allowed_number(value)
{
	// allow all numerics except number with 3 digits that start from 1 or 2
	var r = new RegExp(/^([03-9][0-9]{1,3})|([0-9]{5,25})$/);
	return r.test(value);
}

FollowMe.Numbers = Numbers;