/*
jQuery Browser Plugin
	* Version 1.1
	* 2009-03-09
	* URL: http://www.homeofthehip.com
	* Description: jQuery hashtable extension.
	* Author: Magnus Dunker
	* Copyright: Copyright (c) 2009 Magnus Dunker. Use it anyway you like
	*
	* Updated by Benoit BEGUIN - 2010-05-20 - each(...) method added
	* Updated by Christophe BORNE - 2010-05-20 - source parameter added in the constructor
	* Updated by Christophe BORNE - 2010-05-20 - toJSON(...) method added
	*/

jQuery.Hashtable = function(source) {
	this.items=new Array();
	this.itemsCount=0;

	this.add = function(key,value) 	{
		if(!this.containsKey(key)) {
			this.items[key]=value;
			this.itemsCount++;
		}
		else {
			throw "key '"+key+"' already exists."
		}
	}
	this.get = function(key) {
		if (this.containsKey(key)) return this.items[key];
		else return null;
	}
	this.set = function(key, value) {
		if (this.containsKey(key)) this.items[key]=value;
		else this.add(key, value);
	}
	this.remove = function(key) {
		if (this.containsKey(key)) {
			delete this.items[key];
			this.itemsCount--;
		}
	}
	this.containsKey = function(key) {
		return typeof(this.items[key])!="undefined";
	}
	this.containsValue = function containsValue(value) {
		for (var item in this.items) {
			if (this.items[item]==value) return true;
		}
		return false;
	}
	this.contains = function(keyOrValue) {
		return this.containsKey(keyOrValue) || this.containsValue(keyOrValue);
	}
	this.clear = function() {
		this.items=new Array();
		this.itemsCount=0;
	}
	this.size = function() {
		return this.itemsCount;
	}
	this.isEmpty = function() {
		return this.size()==0;
	}
	this.each = function(callBackMethod) {
        for (var key in this.items) {
            value = this.get(key);
            if (typeof value != 'function') {
                callBackMethod(key, value);
            }
        }
    }
    this.toJSON = function() {
        if(!this.isEmpty()) {
            var obj = new Object();
            for(var key in this.items) {
                obj[key] = this.items[key];
            }
            return obj;
        }
        else {
            return undefined;
        }
    }

    //init the Hashtable with a provided source object, need functions to be declared
    if (source) {
        var obj = new Object();
        for (var key in source) {
            this.add(key, source[key]);
        }
    }
};

