var Application = (function($){
    /*================================================================
                                 Settings
      ================================================================*/
    var options = {
        animationSpeed: 500
    };
    /*================================================================
                                 Variables
      ================================================================*/
    var methods={};
    var string, utils;
    var tmp = {};
   /*================================================================
                                Constructor
      ================================================================*/
    var init = function(){
        string = new String();
        utils = new Utils();     
        setupUI();        
    }
    /*================================================================
                                 Functions
      ================================================================*/
    
    /*=======================PUBLIC=========================== */
    var log = methods.log = function(txt){
        if(window.console){ console.log(txt); }
        else{  alert(txt); }
    }
    
    var scrollTo = methods.scrollTo = function(y){
        $('html, body').animate({
            scrollTop: y
        }, options.animationSpeed);
    }
    
    var addMethod = methods.addMethod = function(name, fn){
        methods[name] = fn;
    }
    
    var setOption = methods.setOption = function(name, val){
        options[name] = val;
    }
    
    /*=======================PRIVATE============================ */
    var getInstance = function(){
        return $.extend(true, methods, {
            String: string,
            Utils: utils
        })
    }
    
    var setupUI = function(){
        
        /* instantiate look & feel*/
        $('input, textarea').placeholder();

		$("a[data-confirm]").click(function(ev){
	    var $link = $(this);
	    var text = $link.attr("data-confirm");
	    return confirm(text); //change to jquery ui
		})
        //$.placeholder.all();
		$("a.button, button").each(function(){
				var $btn = $(this);
				var icon = $btn.attr("data-icon") || "";	    
				/* not already initialized */
				if(!$btn.is(".ui-button")){
						if(string.empty(icon)){
								$btn.button();
						}else{
								$btn.button({
	text: string.empty($btn.attr("data-icon-only")),
										icons: {primary: icon}    
								});
						}
				}
    });
		/* Setup ability to track bill */
		$("body").delegate("[target='_TRACK']", "click", function(ev){
			ev.preventDefault();
			var $link = $(this);
			var url = $link.attr("href");
			if(url){
				$.ajax({
					url: url,
					dataType: 'json',
					success: function(data){
						if(data.success){
							$.growl("Success", data.message || "The bill is added to your tracking list").addClass("ui-growl-success");
							
						if(!data.note){
							data.note = '';	
						}
						if(!data.pos_cust){
							data.pos_cust = '';	
						}
						dform = null;
						dform = '<br /><br /><form id="hurr" method="post"><fieldset><label for="group_id_custom">New Group:</label><br /><input id="group_id_custom" type="text" name="group_id_custom" value=""></input><br /><label for="group_name">Group:</label><br /><select id="group_id" name="group_id">'+data.grp_data+'</select><br /><label for="note">Note:</label><br /> <textarea id="note" name="note">'+data.note+'</textarea>  <br /><label for="btw_position">Position:</label><br /><select id="btw_position" name="btw_position[]">'+data.pos_data+'</select><br /><label for="dpos_cust">Custom Position:</label><br /><input id="btw_position_cust" type="text" name="btw_position_cust" value="'+data.pos_cust+'"></input></fieldset></form>';
												
						$dialog = $('<div></div>')
						.html(data.message+'You may specify additional tracking information below.'+dform) 
						.dialog({
							autoOpen: false,
							title: data.bill_title,
							modal:true,
							type:'POST',
							buttons: {
								"Save": function() {									
									$.ajax({
										url:'http://mirsnews.com/services/track_bill_data',
										dataType:'json',
										data:{
											bill_id:data.bill_id,
											btw_userid:data.user_id,
											btw_id:data.btw_id,
											grp_index_id:data.index_id_grps,
											note_id:data.note_id,									
											index_id_pos:data.index_id_pos,									
											group_id_custom:$("#group_id_custom").val(),
											group_id:$("#group_id").val(),
											note:$("#note").val(),									
											btw_position:$("#btw_position").val(),
											btw_position_cust:$("#btw_position_cust").val()										
											},
										type:'post',
										success:function(data2){
											$.growl("Success", data2.message || "The bill is added to your tracking list").addClass("ui-growl-success");
										},
										complete:function(a,b){
											//$.growl("Success", "Details saved.").addClass("ui-growl-success");
											//$dialog.dialog( "close" );
											$dialog.dialog( "destroy" );
											location.reload();
										}
									});
										
									//$(this).dialog( "close" );
									//$(this).dialog( "destroy" );
									//location.reload();
									//window.setTimeout('location.reload()', 1500);
									//formdata = null;
								}			
							}
						});
						$dialog.dialog('open');
							
							
						}else{
							$.growl("Error", data.message || "An error occurred while trying to track bill").addClass("ui-growl-warning");
						}
					},
					error: function(){
						$.growl("Error", "An error occurred while trying to track bill").addClass("ui-growl-warning");
					}
				});
			}				
		})
		
		
		/* setup autocomplete for any textarea */
    $("input:text.autocomplete").each(function(){
				var $textfield = $(this);
				var use_cache = true;
				//get datasource from html attr
				var url = $textfield.attr("data-src");
				
				var createAutocomplete = function(){
						$textfield.autocomplete({
								//create own for caching functionality
								source: function( request, response ) {
									var term = request.term;		    
									var cacheKey = [$textfield.attr("name"), ".", term].join();
									if (cacheKey in tmp ) {
											response( tmp[ cacheKey ] );
											return;
										}	
								
										lastXhr = $.getJSON(url, request, function( data, status, xhr ) {
												tmp[ cacheKey ] = data;
												if ( xhr === lastXhr ) {
													response( data );
												}
										});
								},
								minLength: 2
						});
				}
				if($textfield.attr("data-autoload")){
						$.ajax({
								url: url,
								dataType: 'json',
								success: function( data, status, xhr ) {
										$textfield.autocomplete({
											source: data,
											minLength: 0
										});
								},
								error: function(){
										createAutocomplete();
								}
						});

				}else{
				
				}
					
			});
    }
    /*================================================================
                                 Classes
      ================================================================*/
    var String = function(){
        var format = function(txt){
            if ( arguments.length <= 1 ) {
                return text;        
            }
            var tokenCount = arguments.length - 2;        
            for( var token = 0; token <= tokenCount; token++ ){
                text = text.replace( new RegExp( "\\{" + token + "\\}", "gi" ), arguments[ token + 1 ] );
            }
            return text;
        }
        
        var empty = function(txt){
            if(txt == null) return true;
            return (txt || "").length == 0;
        }
        /* return methods */
        return {
            format: format,
            empty: empty
        }
        
    }
    
    var Utils = function(){
       return {}; 
    }
    
    //initialize when ready
    $(init);
    return getInstance();
})(jQuery);
