/**
 * Documentation:
 * Author: Jonathan Rosenberg
 * Date: 4/20/2011
 *
 * Description:
 * This function will generate a checklist where you can add items and have predefined items.
 *
 *
 * Example:
 *
 * HTML:
 * <div>
 *      <div class="fn-checklist" items="item 1|item 2|item 3"></div>
 * </div>
 * <ul>
 *      <li class="fn-checklist" items="item 1|item 2|item 3">This is a second note</li>
 * </ul>
 *
 * Javascript:
 * $('.fn-checklist').checklist();
 *          - or -
 * $('.fn-checklist').checklist({
 *      items:["item 1","item 2","item 3","item 4"],
 *      createItem: function(e, el, item) {    });
 * });
 *
 */
jQuery.noConflict();
(function($) { 
 
jQuery.expr[':'].focus = function( elem ) {
  return elem === document.activeElement && ( elem.type || elem.href );
};

(function($) {
	
	// Not *really* a global variable, but this decouples the checklist component
	var globalChecklistIds = [];
	var globalChecklistNames = [];
	var globalDefaultItem = "";
	
    $.fn.checklist = function(options) {

        // hide item-list when clicking off the list
        $('body').bind('click', function(event) {
            var focusOut = true;
            var $target = $(event.target);
            while ($target[0] == undefined || $target[0].tagName.toLowerCase() != "body") {
                if ($target.hasClass("fn-checklist")
                        || $target.hasClass("fn-checklist")
                        || $target[0] == undefined) {
                    focusOut = false;
                    break;
                }
                $target = $target.parent();
            }
            if (focusOut) {
                $('.item-list').remove();
            }
        });

        // initiate timeout hide
        var effectTimer = undefined;
        $('.fn-checklist').live("mouseout", function(e) {
        	if(!$(this).find("input.item-input").is(":focus")) {
	            clearTimeout(effectTimer);
	            effectTimer = setTimeout(function() {
	                $('.item-list').hide();
	            }, 750);
        	}
        });
        // kill timeout hide
        $('.fn-checklist').live("mouseover", function(e) {
            clearTimeout(effectTimer);
        });

        var settings = $.extend({}, $.fn.checklist.defaults, options);
        
        // add ids to items
        var ids = [];
        var names = [];
        if(settings.items.labels != undefined) {
        	for( i = 0; i< settings.items.labels.length; ++i) {
        		ids.push(settings.items.labels[i].id);
        		names.push(settings.items.labels[i].name);
        	}
        }
        
        globalChecklistIds = ids;
        globalChecklistNames = names;
        globalDefaultItem = settings.defaultItem;
        
		// Create empty array if items don't exist
		// Add default item "My Favorites" if item doesn't exist
        if (globalChecklistIds.length == 0){
        	var userCookie = $.cookie("ha-usr-prst");
    		if (userCookie != null) {
            	
            	ha.api.traveler.labels.createLabel(globalDefaultItem, function(data) {
    				
            		var jsonResult = eval("("+data+")");
    				globalChecklistNames = [globalDefaultItem];
    				globalChecklistIds = [jsonResult.id];
    				ha.page.favorites.addLabelUI(globalDefaultItem, jsonResult.id, 0, true);
    			});
            	
    		}
        	
        }

        return this.each(function() {

            var $this = $(this);
            $this.html('<div class="checklist-button"><span class="checklist-button-text-wrapper"><span class="checklist-button-text sprites-heart_pink">'+settings.favoriteText+'</span></span> <span class="checklist-button-dropdown-wrapper"><span class="sprites-arrow checklist-button-dropdown"></span></span></div>');
            hasCheck($this);
            //updateCheckbox($(".fn-checklist .item-list li"), $this);

            $this.bind("createItem", settings.createItem);
            $this.bind("addFavoriteLabel", settings.addFavoriteLabel);
            $this.bind("removeFavoriteLabel", settings.removeFavoriteLabel);
            $this.bind("updateCheckbox", settings.updateCheckbox);
            $this.bind("isLoggedIn", settings.isLoggedIn);

            // Actions for a click event
            $this.click(function(event) {
            	//Put broadcast here
            	$this.trigger("isLoggedIn", [$this]);
            	
                var $target = $(event.target);
                // Creates item-list if there isn't one built
                if ($this.children().length == 1) {
                    $('.item-list').remove();
                    createList($this, settings);
                }
                // Toggle item-list when checklist button is clicked
                if ($target.hasClass("checklist-button-dropdown")) {
                	$('.item-list').remove();
                	createList($this, settings);
                	$this.find('.item-list').css("display", "block");
                    $this.find('.addFavButton').focus();
                    //alert('focus');
                }
                // add default list when checklist button is clicked else uncheck all
                else if ( $target.hasClass("fn-checklist") || $target.hasClass("checklist-button") || $target.hasClass("checklist-button-text") || $target.hasClass("favorite")) {
                	if (!$this.hasClass("has-check")) {
                		addItem($this, globalChecklistIds[0]);
                		$('.item-list').hide();
                	} else {
                		uncheckAll($this);
                		updateCheckbox($target, $this);
                		//$('.item-list').show();
                		//hasCheck();
                	}

                }
                // When new item button is clicked it gets replaced with input textbox and save button
                else if ($target.hasClass("new-item")) {
                    $target.html('<input class="item-input" type="text" name="new_item"/> <span class="save-item-button button-base light xsm-noround">'+settings.saveText+'</span>');
                    $target.find(".item-input").focus();
                }
                // When a checkbox is clicked then it updates a list of of which checkboxes are checked
                else if ($target.is('input[type=checkbox]')) {
                	if($target.is(':checked')){
                		$this.trigger("addFavoriteLabel", [$this, getIdFromName($target.val()) ]);
                	} else {
                		$this.trigger("removeFavoriteLabel", [$this, getIdFromName($target.val()) ]);
                	}
                    updateCheckbox($target, $this);
                }
                // Adds a new item if its a valid item to all the checklists
                else if ($target.hasClass("save-item-button")) {
                    saveItem($this);
                }
                else if ($target.hasClass("uncheck-all")) {
                	uncheckAll($this);
                	updateCheckbox($target, $this);
                }
            });
            $this.keypress(function(event) {
                var $target = $(event.target);
                var $keyCode = $(event.keyCode);

                // save item when enter is pressed keyCode[13] == enter
                if ($keyCode[0] == 13 && $target.hasClass("item-input")) {
                    saveItem($this);
                }
            });
        });

        /**
         * Adds an item to the item-list
         * it modifies the name of the item by removing the |
         * if the value is null, it wll not add it
         * @param $this
         */
        function saveItem($this) {
            var value = $this.find("input[name=new_item]").val();

            //Remove any line dividers
            value = value.replace(/\|/g, "");

            // do some validation
            // can't be empty
            if ($.trim(value) != "") {
            	addItem($this,value);
            	$('.new-item').before('<li class="loading-item">&nbsp;</li>');
            }
        }
        
        function addItem($this,value) {
        		var id="";
        		var dataSpu = $('[data-spu="'+$this.attr("data-spu")+'"]');
        		//Make sure value is not the ID
        		if($.inArray(value, globalChecklistIds) != -1){
            		id=value;
        		} else if ($.inArray(value, globalChecklistNames) == -1) {
        		    // Don't add duplicates
                	ha.page.favorites.createItem($this, value, function(data){              	
                		var jsonResult = eval("("+data+")");
                		id= jsonResult.labels[jsonResult.labels.length-1];

                		// Add item to checklist
                		if(id.length != 0) {        			
                			$this.trigger("addFavoriteLabel", [$this, id]);
                			if ($this.attr("data-favorites") ) {
                				id += '|' + $this.attr("data-favorites");
                			}
                			dataSpu.attr("data-favorites", id);
                		}
                		
                		$('.item-list').remove();
        	            createList($this, settings);
        	            
        	
        	            hasCheck($this);
        	            $this.find('.item-list').show();
                		
                	});
                	
            	} else {
            		id = getIdFromName(value);
            		
            	}
                
        		// Add item to checklist
        		if(id.length != 0) {        			
        			$this.trigger("addFavoriteLabel", [$this, id]);
        			if ($this.attr("data-favorites") ) {
        				id += '|' + $this.attr("data-favorites");
        			}
        			dataSpu.attr("data-favorites", id);
        		}
        
	            $('.item-list').remove();
	            createList($this, settings);
	            
	
	            hasCheck($this);
	            $this.find('.item-list').show();
	
        }

        function updateCheckbox($target, $this) {
        	var dataSpu = $('[data-spu="'+$this.attr("data-spu")+'"]');
        	// add checked values into array
        	
            var checked = $target.parents('ul').find('input:checkbox:checked').map(
                    function() {
                        return this.value;
                    }
                    ).get();
            // convert value to ids in checked array
            checkedIds = [];
            for(i=0; i<checked.length; ++i){
            	checkedIds.push( getIdFromName(checked[i]) );
            }
            // Add item to attribute
            var items = $this.attr("data-favorites");
            var new_items = checkedIds.join('|');
            if (items != new_items) {
            	dataSpu.attr("data-favorites", new_items);
                // publish event ....
            }
            hasCheck($this)
        }

        function hasCheck($this) {
        	var dataSpu = $('[data-spu="'+$this.attr("data-spu")+'"]');
        	if ($this.attr("data-favorites")) {
                if (!$this.hasClass("has-check")) {
                	dataSpu.addClass("has-check");
                	//Add favorite icon to map pin
                	ha.map.base.upDatePinIcon($this.attr("data-spu").slice(4), "isFavorited", true);
                }
            } else {
            	dataSpu.removeClass("has-check")
            	var spu = $this.attr("data-spu").slice(4);
            	//Remove favorite icon to map pin
            	ha.map.base.upDatePinIcon($this.attr("data-spu").slice(4), "isFavorited", false);
            }
        }

        function uncheckAll($this) {
        	$this.find('input:checkbox:checked').each(function() {
        		$('[data-spu="'+$this.attr("data-spu")+'"]').attr('checked', false);
        		$this.trigger("removeFavoriteLabel", [$this, getIdFromName($(this).val()) ]);
        	});
        	
        	
        }
        
        function getNameFromId(id) {
        	var i = $.inArray(id, globalChecklistIds);
        	
        	if(i != -1) {
        		return globalChecklistNames[i];
        	} else {
        		return null;
        	}
        }
        
        function getIdFromName(name) {
        	var i = $.inArray(name, globalChecklistNames);
        	if(i != -1) {
        		return globalChecklistIds[i];
        	} else {
        		return null;
        	}
        }
        
        function createList($this, settings) {
        	var dataSpu = $('[data-spu="'+$this.attr("data-spu")+'"]');
            var checkedList = $this.attr("data-favorites");
            var checkedArr = checkedList ? checkedList.split('|') : [];
            var checkedListHtml = '';
            var checked = '';
            var $checkListLabel = "";
            var $checkList = "";
            var $checkListLi = ""; 	

            for (var i = 0; i < globalChecklistIds.length; i++) {
                // Check if any checkboxes are already checked
                var item = globalChecklistIds[i];
                if ($.inArray(item, checkedArr) > -1) {
                    checked = 'checked="checked"';
                } else {
                    checked = '';
                }
                item = getNameFromId(item);
                $checkList = $('<input type="checkbox" '+checked+'>');
                $checkList.val(item);
                $checkListLabel = $('<label>').text(unescape(item));
                $checkList.prependTo($checkListLabel);
                $checkListLi = $('<li>').append($checkListLabel);

                
                checkedListHtml += "<li>"+$checkListLi.html()+"</li>";
                
                if(settings.uncheckAll) {                	
                	if(i==globalChecklistIds.length-1&&globalChecklistIds.length>5) {
                		checkedListHtml += '<li class="uncheck-all">'+settings.uncheckAllText+'</li>';
                	}
                }

            }

            dataSpu.append(
                    '<ul class="item-list">' +
            			'<li class="view-favorites"><a href="/favorites">'+settings.viewFavoritesText+'</a></li>' +
                        checkedListHtml +
                        '<li class="new-item">'+settings.newFavoriteText+'</li></ul>');

        }


    };
        
    $.fn.checklist.addItem = function(newLabel) {
        //Dont add dublicates
       if ($.inArray(newLabel.id, globalChecklistIds) == -1) {
			globalChecklistIds.push(newLabel.id);
			globalChecklistNames.push(newLabel.name);
       }
    }
    // Replace traveler labels
    $.fn.checklist.newLabels = function(newIds, newNames) {
		globalChecklistIds = newIds;
		globalChecklistNames = newNames;
    }

    $.fn.checklist.defaults = {
    	uncheckAll: false,
    	defaultItem:"My Favorites",
        createItem: function(e, checklist) {
            // Please implement
        },
        addFavoriteLabel: function(e, checklist){
        	// Please implement
        },
        removeFavoriteLabel: function(e, checklist){
        	// Please implement
        },
        updateCheckbox: function(e, checklist) {
            // Please implement
        },
        favoriteText: "Favorites",
		newFavoriteText: "+ Create New List",
		viewFavoritesText: "View my Favorites",
		uncheckAllText: "Uncheck All",
		saveText : "Save"
    }


})(jQuery);
})(jQuery);
