var addressbook;
var current_number = false;


function get_balance(){
	var data = ptBase.get_balance();
	var balance;
	if ((data.result==false) || (data.result=="false")) {
		balance = "";
	} else {
		$.cookie('balance', ""+data.result, { expires: 0, path: '/', secure: false });			
	}
	
	if ((data.result <= 0) || (data.result == "")) {
		ad_loader();
		
		var tmp_splash 		   = $.cookie('tmp_splash');
		var tmp_services_count = $.cookie('tmp_services_count');
		
		if ((tmp_splash == "1") && (tmp_services_count>=2)) {
			$('#splash_upgrade').dialog('open');
			$.cookie('tmp_services_count', null); // delete cookie
		}			
	}
	$.cookie('tmp_splash', "0", { expires: 1, path: '/', secure: false });	
}

function get_services(){
	ptBase.get_services(function(data){
		var len = data.result.length;
		$.cookie('tmp_services_count', len, { expires: 1, path: '/', secure: false });	
		html = '<ul id="sortable_menu" style="list-style-type:none;margin-top:0px;margin-left:0px;padding:0px;border-right:1px solid #f7f7f7;">';
		for(var i=0; i<len; i++){
			html += '<li class="left_menu_item hoverable" style="padding:6px 0px 6px 6px;margin:0px 0px 0px 0px;" onclick="load_service('+data.result[i].api_id+');" id="'+data.result[i].api_id+'">';
			html += '<a href="javascript:void(0);"  style="text-decoration:none;">';
			html += '<img src="'+data.result[i].icon_url+'" style="vertical-align:middle;padding-right:6px;border:none;" />';
			html += data.result[i].service_name;
			html += '</a>';
			html += '</li>';
		}
		html += '</ul>';
		
		$('#left_menu').html(html);
		$("#sortable_menu").sortable({
			placeholder: 'placeholder',
			update: function(){
				save_menu_position();
			}
		});
		
		if ((go_page == "") || (!go_page)) { //if theres no other service to load it will load first one
			load_service(data.result[0].api_id);
		} else {
			load_service (go_page);
		}
		$("#sortable_menu").disableSelection();
	});		
}


function save_menu_position(){
	var items = $(".left_menu_item");
	var new_order = '';
	
	for(var x=0; x<items.length; x++) {
		new_order += items[x].id;
		new_order += ',';                
    }
	
	ptBase.order_services(new_order,function(data){
		//alert(data);
	});
}

function load_service(service_id, callback){
	$('.left_menu_item').removeClass("active");
	$('#'+service_id).addClass("active");
	$('#main_content').fadeOut("slow",function(){
		$('#loader').fadeIn(function(){
			ptBase.load_service(service_id,function(data){
				$('#loader').fadeOut(function(){
					$('#main_content').fadeIn().html(data);
					var tmp_bal = $.cookie('balance');
						if ((tmp_bal <= 0) || (tmp_bal == "")) {
							var html2 = '<img src="'+base+'images/flag_red.png" alt="red" style="border:none;vertical-align:middle;" /> <a href="'+base+'index.php/pages_c/main/add_credit"><b>limited access</b></a>';			
						} else {
							var html2 = '<img src="'+base+'images/flag_green.png" alt="red" style="border:none;vertical-align:middle;" /> <span style="color:#74c61d;"><b>Pro Account</b></span>';	
						}
						$('#pro_status').html(html2);
				});
			});
		});		
	});
}

function add_to_contacts(){
	var number = $.cookie('last_dialed');
	$('#new_contact #n_num').html("+"+number);
	$('#new_contact').dialog('open');
	$('#cont_name').focus();
}

function add_num_contacts(full_number){
	$.cookie('last_dialed', ""+full_number, { expires: 1, path: '/', secure: false });
	$('#new_contact #n_num').html("+"+full_number);
	$('#new_contact').dialog('open');
	$('#cont_name').focus();
}

function save_contact_2(){
	var prefix = ""; 
	var number = "";
	var	prefix_1 = "";
	var	number_1 = ""; 
	var	prefix_2 = "";
	var	number_2 = "";
	var num = $.cookie('last_dialed');
	var my_prefix = get_prefix(num);
	var my_number = num.substring(my_prefix.length);
	switch ($('#phone_type').val()){
		case "0":
			prefix = my_prefix; 
			number = my_number;
			break;
		case "1":
			prefix_1 = my_prefix;
			number_1 = my_number; 
			break;
		case "2":
			prefix_2 = my_prefix;
			number_2 = my_number;
			break;
	}
	ptAddressbook.add_contact($('#cont_name').val(), $('#cont_company').val(), prefix, number, prefix_1, number_1, prefix_2, number_2, "");
	addressbook = ptAddressbook.get_contacts();
	$('#new_contact').dialog("close");
	
	var reload_service = $.cookie('temp');
	if (reload_service=='reload_speed_dial'){
		load_service(speed_dial_id);
	}
}

function show_nb(prefix){
	var html = "";
	$("#nb_number").val("");
	if(countries_list){
		var len = countries_list.length;
		for(var i=0; i<len; i++){
			var item =  countries_list[i];
			var selected = "";
			if(prefix && prefix == item.prefix){
				selected = "selected";
				$("#nb_prefix").val(item.prefix);
			}
			if((prefix == null || prefix == '') && i==0){
				selected = "selected";
				$("#nb_prefix").val(item.prefix);
			}
			html += "<option value='"+item.prefix+"' "+selected+">"+item.countryname+"</option>";
			
		}
	}else{
		html += "<option value='0'>Empty list</option>";
	}
	//$("#nb_country").html(html);
	$("<option value=''></option>").appendTo($("#nb_country"));
	$("<option value=''>---- Pro Destinations ---</option>").appendTo($("#nb_country"));
	$(html).appendTo($("#nb_country"));
	$("#nb_country").bind('change', function(){
		$("#nb_prefix").val($(this).val());
	});
	$("#nb_prefix").bind('keyup', function(){
		var countries = $("#nb_country").children("option");
		var prefix = $(this).val();
		var len = countries.length;
		for(var i=0; i<len; i++){
			if (countries[i].value == prefix) {
				countries[i].selected = true;
				return;
			};
		}
	});
	$("#nb").dialog('open');
}

function set_destination(prefix, number){
	hide_address();
	$('#to_prefix').val('').val(prefix);
	$('#to_phone').val('').val(number);
	$('#to_prefix').keyup();
	$('#to_phone').focus();
	$('#to_phone').keyup();
}

function get_prefix(number){
	if (countries_list) {
		var len = countries_list.length;
		for (var i = 0; i < len; i++) {
			var item = countries_list[i];
			var re = new RegExp("^"+item.prefix);
			if(re.test(number)){
				return item.prefix;
			}
		}
	}
	return "";
}



function ad_loader(){
//	$('#adspot_right').show();

//	$('#adspot_top').show();	
//	$('#ads_remove_option').show();	
}

function remove_ads(){
	$('#adspot_right').hide();
	$('#adspot_top').hide();	
	$('#ads_remove_option').hide();		
}



function formate_contacts( prm_contacts ) {
    var raw_contacts = (prm_contacts) ? prm_contacts : addressbook.result, 
        contacts = [], j = 0;
    for( i in raw_contacts ) {
        raw_contacts[i]['contact_name'] = ( raw_contacts[i]['contact_name'] ) ? raw_contacts[i]['contact_name'] : ''; 
        raw_contacts[i]['company'] = ( raw_contacts[i]['company'] ) ? raw_contacts[i]['company'] : '';
        if (/^[0-9#]+$/.test(raw_contacts[i]['value'])) {
            contacts[j] = {id: raw_contacts[i]['id'], prefix: raw_contacts[i]['code'], number: raw_contacts[i]['value'], country_id: null, fld: 1, title: raw_contacts[i]['contact_name']+' '+raw_contacts[i]['company'] + ' [Tel.]'};
            j++;
        }
        if (/^[0-9#]+$/.test(raw_contacts[i]['value_1'])) {
            contacts[j] = {id: raw_contacts[i]['id'], prefix: raw_contacts[i]['code_1'], number: raw_contacts[i]['value_1'], country_id: null, fld: 2, title: raw_contacts[i]['contact_name']+' '+raw_contacts[i]['company'] + ' [Mob.]'};
            j++;
        }
        if (/^[0-9#]+$/.test(raw_contacts[i]['value_2'])) {
            contacts[j] = {id: raw_contacts[i]['id'], prefix: raw_contacts[i]['code_2'], number: raw_contacts[i]['value_2'], country_id: null, fld: 3, title: raw_contacts[i]['contact_name']+' '+raw_contacts[i]['company'] + ' [Office.]'};
            j++;
        }
    }
    return contacts;
}

$(document).ready(function(){
	//check_user();
	//$('img[src=.png]').ifixpng();
	//$('#promo').show();

	var browserName=navigator.appName; 
	var browserVer=parseInt(navigator.appVersion); 
	if ((browserName=="Microsoft Internet Explorer" && browserVer<=8)) {
		var modal_box = false;
	}	else {
		var modal_box = true;
	}

	ptBase.check_login(function(data){
		if (!data.result) {
			$.cookie('balance', null); // delete cookie
			$.cookie('fullname', null); // delete cookie
			window.location = base;
		}
	});
	get_services();
	addressbook = ptAddressbook.get_contacts();
		
	//$('#balance').html($.cookie('balance'));
	
	$("#error").dialog({
		modal: false,
		autoOpen: false,
		closeOnEscape: true,
		buttons: {
		"close": function(){
				$(this).dialog("close");
			}
		}
	});
	
	$("#nb").dialog({
		modal: false,
		autoOpen: false,
		closeOnEscape: true
	});
	
	$("#ex").dialog({
		modal: false,
		autoOpen: false,
		closeOnEscape: true
	});
	
	$("#advert_pop").dialog({
		modal: modal_box,
		autoOpen: false,
		closeOnEscape: false,
		width: 400,
		height:340
	});
	
	$("#splash_upgrade").dialog({
		modal: modal_box,
		autoOpen: false,
		closeOnEscape: true,
		buttons: {
		"continue free account": function(){
				$(this).dialog("close");
			},
		"upgrade": function(){
			upgrade_from_splash();
			}		
		},
		width: 370,
		height:340
	});	

	$("#new_contact").dialog({
		modal: false,
		autoOpen: false,
		closeOnEscape: true,
		buttons: {
			"Cancel": function(){
				$(this).dialog("close");
			},
			"Save": function(){
				$.cookie('temp', "reload_speed_dial", { expires: 1, path: '/', secure: false });
				save_contact_2();
			}
		}
	});	
	
	get_balance();	
	
});


/*
 * Plugin PersonalNumbers
 * 
 * Require poketalk.contacts.js
 * 
 * Example:
 * 
$.PersonalNumbers( $('.my_phone'), {
    showSelect: true,
    button: '<button>...</button>',
    dialog: {
        title: 'My numbers',
        autoOpen: false,
        buttons: {
            'Close': function(e) {
                $(this).dialog('close');
            },
        }
    }
} );
*/

(function($) {
    /*
     * Require: UI.Dialog, EditPhone
     * Params:
     *      dialog:       [objects] params ui.dialog
     *      showSelect:   [bool]
     *      defaultPhone: [object] {country_id: '', prefix: '', number: ''}
     *      countries:    [objects]
     *      service_id:   [int]
     *      button:       [string]
     * Events
     *      onChangeSelect: 
     *      onDeleteNumber: (phone, settings)
     *      onAddNumber:    (phone, settings)
     * Methods:
     *      openDialog:
     *      openAddNew:
     *      getData:    array [country_id, prefix, number, number_id]
     *      getNumbers: array
     *      destroy:
     */
    jQuery.fn.PersonalNumbers = function( options ) {
        var PROP_NAME = 'hasPersonalNumbers';
        var pnId = 'PersonalNumbersWindow';
        var settings = jQuery.extend({}, jQuery.fn.PersonalNumbers.defaults, options);
        var self = this;
        settings.lastadd_number_id = null;

        function changeSelect(e) {
            var number_id = jQuery(e.target).val(),
                target = jQuery(e.target).parent(),
                phone = null;
            //var settings = jQuery(target).data('settings');
                
            if (number_id) {
                ptContacts.save_service_number({service_id: settings.service_id, number_id: number_id});
                phone = settings.numbers[number_id];
                jQuery(target).data('phone', phone);
            } else {
                jQuery(target).removeData('phone');
                //ptContacts.remove_service_number({service_id: settings.service_id})
            }
            
            if (settings.onChangeSelect) {
                settings.onChangeSelect.apply(e.target,[phone, settings]);
            }
        }
                
        function renderSelect( self, settings, curr ) {
            var uiSelect = null;
            settings.numbers = {};
            var numbers = getNumbers( settings );
            for(var i in numbers) {
                settings.numbers[numbers[i]['number_id']] = {'prefix': numbers[i]['prefix'],'number': numbers[i]['number'],'country_id': numbers[i]['country_id'],'number_id': numbers[i]['number_id']};
            }
            
            if (settings.showSelect) {
                var service_number = ptContacts.get_service_number({
                    service_id: settings.service_id
                });

                if (curr>0) {
                    var curr_number = curr;    
                } else {
                    var curr_number = service_number['id'];
                }

                // make phones list
                var html = '';
                for(var i in numbers) {
                    //settings.numbers[numbers[i]['number_id']] = {'prefix': numbers[i]['prefix'],'number': numbers[i]['number'],'country_id': numbers[i]['country_id'],'number_id': numbers[i]['number_id']};
                    html += '<option value="'+numbers[i]['number_id']+'">'+numbers[i]['prefix']+'-'+numbers[i]['number']+'</option>';
                }
                
                uiSelect = jQuery('select', self);
                if ( uiSelect.is('.mynumbers') ) {
                    var old = uiSelect.val();
                    uiSelect.html( html );
                    if (curr_number) uiSelect.val( curr_number );
                    if (old != uiSelect.val()) uiSelect.change();
                    if (old != uiSelect.val()) {
                        uiSelect.change();
                    }
                } else {
                    // create select tag
                    uiSelect = jQuery('<select class="mynumbers" name="mynumber" style="width:140px;">' + html + '</select>').change( changeSelect );
                    uiSelect.val( curr_number );
                    if( !service_number ) {
                        uiSelect.change();
                    }
                    jQuery(self).html( uiSelect );                
                }
            }
            
            jQuery(self).data('settings', settings);

            // set phone data
            if ( uiSelect && uiSelect.val() ) {
                jQuery(self).data('phone', settings.numbers[uiSelect.val()]);
            } else {
                jQuery(self).removeData('phone');
            }
            
            return uiSelect;
        }   

        function refreshTable( self, settings ) {
            var numbers = ptContacts.get_numbers({});
            //var services = ptContacts.get_service_numbers();
            var html ='<table width="100%" border="0" cellpadding="0" cellspacing="0">';
            var i = 0;
            if (numbers) {
                for (i in numbers) {
                    html += '<tr class="id'+numbers[i]['number_id']+'"><td></td><td class="phone">' + numbers[i]['prefix'] + '-' + numbers[i]['number'] + '</td><td style="width:80px;"><img src="' + base + 'images/phone_delete.png" alt="delete phone" style="vertical-align:middle;">&nbsp;<a href="#" class="remove" rel="' + numbers[i]['number_id'] + '">Delete</a></td></tr>';
                }
            } else {
                html += '<tr><td></td></tr>';
            }
            html += '</table><div class="newphone" style="padding:4px;"></div><button type="button" class="add">Add</button>';
            jQuery('#'+pnId).html( html );
            
            //var phone = jQuery(self).data('phone');
            //jQuery('#'+pnId+' table tr[class=id'+phone.number_id+']').css({backgroundColor: '#eeeeee'});

            if (!i) jQuery('#'+pnId+' .add').click(); 
        }

        function getNumbers( settings ) {
            var numbers = ptContacts.get_numbers({});

            // set default phone if empty numbers
            if ( !numbers && settings.defaultPhone && settings.defaultPhone.country_id && settings.defaultPhone.prefix && settings.defaultPhone.number ) {
                var phone = settings.defaultPhone;
                settings.defaultPhone.is_my = 1;
                var number_id = ptContacts.add_number( settings.defaultPhone );
                ptContacts.save_service_number( {service_id: settings.service_id, number_id: number_id} );
                numbers = {};
                phone.number_id = number_id;
                delete phone.api_key;
                delete phone.is_my;
                numbers[number_id] = phone;
            }
            
            return numbers;            
        }
        
        function phoneClose() {
            jQuery('#'+pnId+' .newphone').hide();
            jQuery('#'+pnId+' .add').show();
        }


        switch( options ) {
            case 'openDialog': 
                refreshTable( self );
                jQuery( '#' + pnId ).data( 'activeSelf', self );
                var settings = jQuery(self).data( 'settings' );
                settings.lastadd_number_id = null;
                jQuery(self).data('settings');
                jQuery( '#' + pnId ).dialog('open');
                return;
            case 'openAddNew':
                var settings = jQuery(self).data( 'settings' );
                settings.lastadd_number_id = null;
                jQuery(self).data('settings');
                refreshTable( self, jQuery(this).data( 'settings' ) );
                jQuery( '#' + pnId ).data( 'activeSelf', self );
                jQuery( '#' + pnId ).dialog('open');
                jQuery('#'+pnId+' .add').click();
                return;
            case 'getData':   
                return jQuery(this).data( 'phone' );            
            case 'getNumbers':   
                return getNumbers( jQuery(this).data( 'settings' ) );
            case 'renderSelect':
                renderSelect( self, jQuery(this).data( 'settings' ) );
                return;            
            case 'destroy':
                jQuery(this).removeData( 'phone' );
                jQuery(this).removeData( 'settings' );
                jQuery(this).remove();
                jQuery( '#'+pnId ).removeData( 'activeSelf' );
                jQuery( '#'+pnId ).dialog( 'destroy' ).remove();
                return;
        }

        // init dialog
        if ( !jQuery( '#'+pnId ).length ) {
            jQuery('body').append('<div id="'+pnId+'" style="display:none;"></div>');
            settings.dialog.close = function(){
                var self = jQuery('#'+pnId).data('activeSelf');
                var settings = jQuery(self).data('settings');
                var uiSelect = renderSelect(self, settings, settings.lastadd_number_id);
            };
            jQuery( '#'+pnId ).dialog( settings.dialog );
        }


        return this.each(function() {
            var self = this;
            if (!jQuery(self).is('.'+PROP_NAME)) {
                jQuery(self).data('settings', settings);
                renderSelect(self, settings);
                jQuery(self).addClass(PROP_NAME);
                uiBtnShowDialog = (settings.button) ? jQuery(settings.button) : jQuery('<button type="button">...</button>');
                uiBtnShowDialog.addClass('myphone');
                jQuery(self).append(uiBtnShowDialog);

                jQuery('#'+pnId+' .remove').live('click', function(a) {
                    var self = jQuery( '#' + pnId ).data( 'activeSelf' );
                    var number_id = jQuery(this).attr('rel');
                    var settings = jQuery(self).data('settings');
                    var phone = settings.numbers[number_id];
                        
                    if ( ptContacts.remove_number( {number_id: number_id} ) ) {
                        jQuery(this).parents('tr').remove();
                        if ( settings.numbers[number_id] ) delete settings.numbers[number_id];
                    }
                    
                    if (settings.numbers && !settings.numbers.length) {
                        settings.defaultPhone = null;
                    }
        
                    if (settings.onDeleteNumber) {
                        settings.onDeleteNumber.apply(this,[phone, settings]);
                    }
                    
                    jQuery(self).data('settings', settings);
                    return false;
                });

                jQuery('#'+pnId+' .add').live( 'click', function() {
                    jQuery('#'+pnId+' .add').hide();
                    jQuery('#'+pnId+' .newphone').css({
                        border: '1px solid #cccccc',
                        backgroundColor: '#fefef0'
                    }).show();
                    var phone = jQuery('#'+pnId+' .newphone');
                    phone.editphone({
                        countries: settings.countries,
                        buttons: {
                            'Save': function(params,a,b) {
                                if (!phone.editphone( 'validatePrefix', params.prefix)) {
                                    alert('Prefix only numbers (0-9)!');
                                    return;
                                }
                                if (!phone.editphone( 'validateNumber', params.number)) {
                                    alert('Number only numbers (0-9)!');
                                    return;
                                }
                                jQuery('#'+pnId+' .newphone .ui-dialog-buttonpane').html('<img src="'+base+'images/websedit-ag-bar.gif" />');
                                params.is_my = 1;
                                number_id = ptContacts.add_number( params );
                                delete params.is_my;
                                params.number_id = number_id;
                                refreshTable();
                                phoneClose();
                                phone.editphone('refresh');
                                
                                var self = jQuery( '#' + pnId ).data( 'activeSelf' );
                                var settings = jQuery(self).data('settings');
                                settings.lastadd_number_id = params.number_id;
                                jQuery(self).data('settings', settings);
                                
                                if (settings.onAddNumber) {
                                    settings.onAddNumber.apply(this,[params, settings]);
                                }
                    
                            },
                            'Cancel': function() {
                                phoneClose();
                            }
                        }
                    });
                });

                jQuery('.myphone', self).click(function(){
                    jQuery(self).PersonalNumbers('openDialog');
                });
            }
        });
    };

    jQuery.fn.PersonalNumbers.defaults = {
        defaultPhone: null,
        showSelect: true,
        countries: null,
        button: null,
        onChangeSelect: null,
        dialog: {
            autoOpen:false
        }
    };

})(jQuery);


/*
 * Plugin EditPhone (countries, prefix, number)
 */

(function($){

function EditPhone() {
    this.defaults = {
        render_rows: 2,
        buttons: {},
        labels: {
            prefix: '',
            number: ''
        },
        data: {
            countries: null,
            country_id: 0,
            prefix: '',
            number: '',
            number_id: 0,
            contacts: null,
            number_id: 0,
            contact_id: 0
        },
        validatePrefix: function(value) {
            return /^[0-9]+$/.test(value);
        },
        validateNumber: function(value) {
            return /^[0-9#]+$/.test(value);
        },
        onRenderCountries: null,
        onChangeCountry: null,
        onKeyUpPrefix: null,
        onChangeNumber: null,
        onSelectContact: null,
        onRefresh: null
    };        
}

var PROP_NAME = 'editphone';
    

jQuery.extend(EditPhone.prototype, {

    markerClassName: 'hasEditPhone',
        
    _get: function(inst, name) {
        return (inst.options[name] != null ?
            inst.options[name] : jQuery.editphone.defaults[name]);
    },
    
    _attach: function(target, options) {
        var _target = jQuery(target);
        if (_target.hasClass(this.markerClassName)) {
            return;
        }
        _target.addClass(this.markerClassName);
        var inst = {options: jQuery.extend({}, options), data:{}};
        inst.data.number_id = options.number_id;
        inst.data.country_id = options.country_id;
        inst.data.contact_id = options.contact_id;
        inst.data.prefix = options.prefix;
        inst.data.number = options.number;
        inst.data.country_name = '';
        inst.data.contact_name = '';
        if ( typeof inst.options.countries == 'function' ) {
            inst.options.countries = inst.options.countries.apply();
        }
        if ( typeof inst.options.contacts == 'function' ) {
            inst.options.contacts = inst.options.contacts.apply();
        }
        jQuery.data(target, PROP_NAME, inst);
        this._changeEditPhone(target);
        this._refreshEditPhone(target, inst);
    },

    _changeEditPhone: function(target, options, value) {
        options = options || {};
        if (typeof options == 'string') {
            var name = options;
            options = {};
            options[name] = value;
            var inst = jQuery.data(target, PROP_NAME);
            //this._resetExtraLabels(inst.options, options);
            extendRemove(inst.options, options);
            jQuery.data(target, PROP_NAME, inst);
            this._refreshEditPhone(target, inst);
        }
    },
    
    _destroyEditPhone: function( target ) {
        var _target = jQuery(target);
        if (!_target.hasClass(this.markerClassName)) {
            return;
        }
        _target.removeClass(this.markerClassName).empty();
        jQuery.removeData(target, PROP_NAME);
    },
    
    _refreshEditPhone: function(target, inst) {
        var inst = inst || jQuery.data(target, PROP_NAME);
        if (!inst) {
            return;
        }
        
        var self = this;
        var _target = jQuery(target);
        var data = this._get(inst, 'data');
        
        var uiPhone = this._renderEditPhone(target, inst);
        uiPhone.find('[name=country]').val( data.country_id || 0 );
        uiPhone.find('[name=prefix]').val( data.prefix );
        uiPhone.find('[name=number]').val( data.number );
        _target.empty().append( uiPhone );
        
        if (buttons = this._createButtons( target, inst )) {
            buttons.appendTo(_target);
        }

        _target.find('[name=country]')
            .change(function(){
                self.onChangeCountry( target, inst, this );
            });
        _target.find('[name=prefix]')
            .keyup( function(){
                self.onKeyUpPrefix( target, inst, this );
            });

        _target.find('[name=number]')
            .change( function(){
                self.onChangeNumber( target, inst, this );
            });
        _target.find('[name=number]')
            .keyup( function(){
                self.onKeyUpNumber( target, inst, this );
            });
            
        var contacts = this._get( inst, 'contacts' );
        if ( contacts ) {
            this._refreshContactsEditPhone( target, inst );
        }
        
        jQuery.data(target, PROP_NAME, inst);

        var onRefresh = this._get(inst, 'onRefresh');
        if (onRefresh) {
            onRefresh.apply(target, inst);
        }
    },

    _getDataEditPhone: function(target) {
        var inst = jQuery.data(target, PROP_NAME);
        var $target = jQuery(target);
        $target = jQuery(target);
        inst.data.country_id = $target.find( '[name=country]' ).val();
        inst.data.prefix = $target.find( '[name=prefix]' ).val();
        inst.data.number = $target.find( '[name=number]' ).val();
        var ext = $target.find( '[name=extension]' ).val();
        inst.data.number += (ext) ? '#'+ext : ''; 
        inst.data.number_id = this._get(inst, 'data').number_id;
        //inst.data.country_name = jQuery('option:selected', $target.find( '[name=country]' )).text();
        jQuery.data(target, PROP_NAME, inst);
        return inst.data;
    },
    
    _getPrefixByCountryEditPhone: function( target, inst, country_id ) {
        var countries = this._get( inst, 'countries' );
        for( i in countries ) {
            if (countries[i]['id'] == country_id) {
                return countries[i]['prefix'];
            } 
        }
        return '';
    },
    
    _getCountryByPrefixEditPhone: function( target, inst, prefix ) {
        var countries = this._get( inst, 'countries' );
        for( i in countries ) {
            if (countries[i]['prefix'] == prefix) {
                return countries[i]['id'];
            } 
        }
        return 0;
    },

    _setPhoneEditPhone: function( target, phone ) {
        var inst = jQuery.data( target, PROP_NAME );
        var countries = this._get( inst, 'countries' );
        if ( typeof phone == 'number' ) {
            phone = phone.toString();
        }
        if ( typeof phone == 'string' ) {
            var prefix = '';
            for( i in countries ) {
                prefix = countries[i]['prefix'];
                if ( phone.substr( 0, prefix.length ) == prefix ) {
                    this._setPhoneAndRefresh( target, inst, countries[i]['id'], countries[i]['prefix'], phone.substr( prefix.length ) );
                    return true;
                }
            }
            return false;
        } else if ( typeof phone == 'object' && phone.prefix && phone.number ){
            phone.country_id = (phone.country_id) ? phone.country_id : null;
            this._setPhoneAndRefresh( target, inst, phone.country_id, phone.prefix, phone.number );
        } else {
            return false;
        }
    },
    
    _setPhoneAndRefresh: function( target, inst, country_id, prefix, number ) {
        if (!country_id) {
            country_id = this._getCountryByPrefixEditPhone( target, inst, prefix );
        }
        inst.data.country_id = country_id;
        inst.data.prefix = prefix;
        inst.data.number = number;
        inst.uiPhone.find('[name=country]').val( country_id );
        inst.uiPhone.find('[name=prefix]').val( prefix );
        inst.uiPhone.find('[name=number]').val( number );
    },
    
    _cleanEditPhone: function( target ) {
        jQuery(target).find('[name=country]').val(0);        
        jQuery(target).find('[name=prefix]').val('');        
        jQuery(target).find('[name=number]').val('');        
    },
    
    _validatePrefixEditPhone: function( target, value ) {
        var inst = jQuery.data(target, PROP_NAME);
        var validatePrefix = this._get( inst, 'validatePrefix' );
        return validatePrefix(value);
    },
    
    _validateNumberEditPhone: function( target, value ) {
        var inst = jQuery.data(target, PROP_NAME);
        var validateNumber = this._get( inst, 'validateNumber' );
        return validateNumber(value);
    },
    
    _removeTarget: function(target) {
        jQuery(target).remove();
    },

    _renderEditPhone: function(target, inst) {
        inst.uiPhone = jQuery('<div></div>').addClass('ui-phone');
        var countries_options = '<option value="0">Select</option>';
        var countries = this._get(inst, 'countries');
        var onRenderCountries = this._get(inst, 'onRenderCountries');
        if ( onRenderCountries ) {
            countries_options = onRenderCountries.apply( this, [countries] );
        } else {
            for ( i in countries ) {
                countries_options += '<option value="' + countries[i]['id'] + '">' + countries[i]['countryname'] + '</option>';
            }
        }

        var labels = this._get(inst, 'labels');
        var label_prefix = (labels.prefix) ? '<label class="prefix">'+labels.prefix+'</label>' : ''; 
        var label_number = (labels.number) ? '<label class="number">'+labels.number+'</label>' : ''; 

        if (this._get(inst, 'render_rows') == 1) {
            jQuery('\
                <table width="100%" cellpadding="0" cellspacing="0" class="phone"><tr>\
                    <td width="50px"><input name="prefix" value="" style="width:45px;text-align:center;border-right-width:0;" class="ui-widget ui-widget-content ui-corner-left"/></td>\
                    <td width="50%"><input name="number" value="" style="width:100%" class="ui-widget ui-widget-content ui-corner-right"/></td>\
                    <td width="40%"><select name="country" nowrap style="width:100%;height:20px;"></select></td>\
                </tr></table>').appendTo( inst.uiPhone );
        }
        else {
            jQuery('\
                <table width="100%" cellpadding="0" cellspacing="0" class="phone"><tr>\
                    <td width="100%" colspan="4" class="countries"><select name="country" style="width:100%;height:20px;"></select></td>\
                </tr><tr>\
                    <td width="1%" nowrap class="prefix" align="center"><input name="prefix" value="" style="text-align:right;width:45px" class="ui-widget ui-widget-content ui-corner-left"/></td>\
                    <td width="1%">&nbsp;</td>\
                    <td width="97%" class="number" align="left"><input name="number" value="" style="width:98%" class="ui-widget ui-widget-content ui-corner-right" /></td>\
                    <td width="1%" class="extension" nowrap style="display:none;"><span style="color:#999999">#</span><input name="extension" class="ui-widget ui-widget-content ui-corner-right" style="width:40px;"/></td>\
                </tr>\
                <tr><td colspan="4" style="text-align:right;"><a href="#" class="extension" style="padding-right:10px;color:#999999;font-size:9px;">extension&nbsp;>></a></td></tr>\
                </table>').appendTo( inst.uiPhone );
        }

        var self = this;
        
        inst.uiPhone.find('[name=country]').html( countries_options );
        inst.uiPhone.find('a.extension').toggle(
            function() {
                inst.uiPhone.find('[name=number]').removeClass('ui-corner-right');
                inst.uiPhone.find('table td.extension').show();
                var uiExt = inst.uiPhone.find('[name=extension]');
                var uiNumber = inst.uiPhone.find('[name=number]');
                var number = uiNumber.val();
                var n = number.split( '#', 2 );
                uiNumber.val( n[0] );
                uiExt.val( n[1] );
                uiExt.focus();
                
                return false;
            },
            function() {
                inst.uiPhone.find('table td.extension').hide();
                var uiNumber = inst.uiPhone.find('[name=number]');
                var uiExt = inst.uiPhone.find('[name=extension]');
                if ( uiExt.val() ) {
                    var number = uiNumber.val();
                    uiNumber.val(number + '#' + uiExt.val());
                    uiExt.val('');
                }
                uiNumber.addClass('ui-corner-right').focus();
                return false;
            }
        );
        
        if (label_prefix || label_number) {
            inst.uiPhone.find('tr:last').append('<tr><td>'+label_prefix+'</td><td></td><td>'+label_number+'</td></tr>');
        }
        
        return inst.uiPhone;        
    },
    
    onChangeCountry: function( target, inst, self ) {
        var country_id = jQuery(self).val();
        var onChangeCountry = this._get(inst, 'onChangeCountry');
        if (onChangeCountry) {
            onChangeCountry.apply(target, inst, country_id);
        } else {
            var prefix = this._getPrefixByCountryEditPhone( target, inst, country_id );
            jQuery(target).find('[name=prefix]').val( prefix );
        }
        //inst.data.country_name = jQuery('option:selected', $target.find( '[name=country]' )).text(); 
    },
    
    onKeyUpPrefix: function( target, inst, self ) {
        var prefix = jQuery(self).val();
        var onKeyUpPrefix = this._get(inst, 'onKeyUpPrefix');
        //inst.data.contact_name = '';
        if (onKeyUpPrefix) {
            var inst = jQuery.data(target, PROP_NAME);
            onKeyUpPrefix.apply(target, inst, prefix);
        } else {
            var country_id = this._getCountryByPrefixEditPhone( target, inst, prefix );
            jQuery(target).find('[name=country]').val( country_id );
        }
        jQuery.data(target, PROP_NAME, inst);
    },
    
    onChangeNumber: function( target, inst, self ) {
        
    },
    
    onKeyUpNumber: function( target, inst, self ) {
        //inst.data.contact_name = '';
        var number = jQuery(self).val();
        var onKeyUpNumber = this._get(inst, 'onKeyUpNumber');
        if (onKeyUpNumber) {
            var inst = jQuery.data(target, PROP_NAME);
            onKeyUpNumber.apply(target, inst, number);
        }
        jQuery.data(target, PROP_NAME, inst);
    },
    
    _createButtons: function( target, inst ) {
        var self = this,
            hasButtons = false,
            buttons = this._get(inst, 'buttons'),
            uiPhoneButtonPane = jQuery('<div></div>')
            .addClass('ui-dialog-buttonpane ui-helper-clearfix')
            .css( 'text-align', 'right' );
            
        var _target = jQuery(target);
        
        _target.find('.ui-dialog-buttonpane').remove();
        (typeof buttons == 'object' && buttons !== null &&
            jQuery.each(buttons, function() { return !(hasButtons = true); }));
            
        if (hasButtons) {
            jQuery.each(buttons, function(name, fn){
                jQuery('<button type="button"></button>')
                    .addClass('ui-state-default ' + 'ui-corner-all')
                    .text(name)
                    .click(function(){
                        fn.apply(self, [self._getDataEditPhone(target, inst), inst, name]);
                    })
                    .hover(
                        function(){jQuery(this).addClass('ui-state-hover');}, 
                        function(){jQuery(this).removeClass('ui-state-hover');}
                    )
                    .focus(function(){jQuery(this).addClass('ui-state-focus');})
                    .blur(function(){jQuery(this).removeClass('ui-state-focus');})
                    .css( {margin: '0 2px'} )
                    .appendTo(uiPhoneButtonPane);
            });
            return uiPhoneButtonPane;
        }
        return false;
    },
    
    _refreshContactsEditPhone: function( target, inst ) {
        var contacts = this._get( inst, 'contacts' );
        if ( typeof(jQuery.Autocompleter) != 'function' || !contacts ) {
            return false;
        }
        var self = this;
        jQuery(target).find( '[name=number]' ).autocomplete(contacts, {
            minChars: 0,
            matchContains: "word",
            autoFill: false,
            formatItem: function(row, i, max) {
                var title = (row.title) ? ' ' + row.title : '';
                return row.prefix + "-" + row.number + title;
            },
            formatMatch: function(row, i, max) {
                var title = (row.title) ? ' ' + row.title : '';
                return row.prefix + "-" + row.number + title;
            },
            formatResult: function(row) {
                return row.number;
            }
        }).result(function(e, d, f){
            $target = jQuery(target);
            inst.data.country_id = (d.country_id) ? d.country_id : self._getCountryByPrefixEditPhone( target, inst, d.prefix );
            $target.find( '[name=country]' ).val( inst.data.country_id );
            $target.find( '[name=prefix]' ).val( d.prefix );
            inst.data.contact_id = d.id;
            inst.data.number = d.number;
            inst.data.prefix = d.prefix;
            inst.data.number_id = (inst.options.data && inst.options.data.number_id) ? inst.options.data.number_id : null;
            inst.data.country_name = jQuery('option:selected', $target.find( '[name=country]' )).text();
            inst.data.contact_name = d.title;
            
            var onSelectContact = self._get(inst, 'onSelectContact');
            if (onSelectContact) {
                onSelectContact.apply(self, [inst.data, e]);
            }
        });
    }
});

function extendRemove(target, props) {
    jQuery.extend(target, props);
    for (var name in props) {
        if (props[name] == null) {
            target[name] = null;
        }
    }
    return target;
}

jQuery.fn.editphone = function(options) {
    var otherArgs = Array.prototype.slice.call(arguments, 1);
    if (options == 'validatePrefix' || options == 'validateNumber' || options == 'getData' || options == 'setPhone') {
        return jQuery.editphone['_' + options + 'EditPhone'].apply(jQuery.editphone, [this[0]].concat(otherArgs));
    }
    return this.each(function() {
        if (typeof options == 'string') {
            jQuery.editphone['_' + options + 'EditPhone'].apply(jQuery.editphone, [this].concat(otherArgs));
        }
        else {
            jQuery.editphone._attach(this, options);
        }
    });
};

jQuery.editphone = new EditPhone(); 

})(jQuery);
