/***
* @author 			Oskar Hasinski ( hasinski@popsit.com )
* @package			ItemtManager
* 
* @created			20.12.2008
* @updated			07.02.2009
* @updateAuthor		Oskar Hasinski
* 
* @copy				Oskar Hasinski, Miet24 GmbH
**/

//String.ucwords( $str )
//{
//	return ($str + '').replace(/^([a-z])|\s+([a-z])/g, function ($1) {
//        return $1.toUpperCase();
//    });
//}

String.prototype.ucwords = function(){
	return this.replace(/\w+/g, function(a){
        return a.charAt(0).toUpperCase() + a.substr(1).toLowerCase();
    });
};


/* jQuery expand */
jQuery.preloadImages = function()
{
	for(var i = 0; i<arguments.length; i++)
	{
		jQuery("<img>").attr("src", arguments[i]);
	};
};





jQuery.implode = function( glue,pieces )
{
	return ( ( pieces instanceof Array ) ? pieces.join( glue ) : pieces );

};
jQuery.in_array = function( needle,haystack,argStrict )
{
	var key = '', strict = !!argStrict;
 
	if (strict)
	{
		for (key in haystack)
		{
			if (haystack[key] === needle)
			{
				return true;
			};
		};
	}
	else
	{
		for (key in haystack)
		{
			if (haystack[key] == needle)
			{
				return true;
			};
		};
	};
 
    return false;
};

jQuery.disableKey	= function( $key, $scope )
{
	var $key_code;
	$( $scope ).bind( 'keydown', function( event ){
		if( window.event )
		{
			$key_code	= window.event.keyCode;
		}
		else
		{
			$key_code	= event.which;
		}
		
		if( $key_code == $key )
		{
			event.preventDefault();
		}
	});	
}

String.prototype.trim = function() {
	return this.replace(/^\s+|\s+$/g,"");
}

jQuery.getUrlVars = function()
{
	var vars = [], hash;
	var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
	for(var i = 0; i < hashes.length; i++)
	{
		hash = hashes[i].split('=');
		vars.push(hash[0]);
		vars[hash[0]] = hash[1];
	};
	return vars;
};

jQuery.getUrlVar = function( name )
{
	return $.getUrlVars()[name];
};

/**
 * SET class
 * @author 		Oskar Hasinski (hasinski@popsit.com)
 * @created		01.02.2009
 * @updated		07.02.2009
 **/

function _set()
{
	this.data_arr 			= Array();
	this.scope 				= '';
	this.valStatus		= Array();
	
	this.data = function( key,value )
	{
		this.data_arr[key] = value;
	};
	
	this.setScope = function (scope)
	{
		this.scope = '#'+scope+' ';
	};
}
set = new _set();

/**
 * GET class
 * @author 		Oskar Hasinski (hasinski@popsit.com)
 * @created		01.02.2009
 * @updated		06.02.2009
 **/

function _get()
{
	this.data = function ( key )
	{
		return set.data_arr[key];
	};
	
	this.date = function()
	{
		return new Date;
	};
	
	this.charactersPosition = function(pattern, needle)
	{
		var position = Array();
		var arr = 0;
		for(i=0; i<pattern.length; i++)
		{
			if(pattern.charAt(i) == needle)
			{
				position[arr] = i;
				arr++;
			};
		};	
		return arr[0];
	};
};
get = new _get();

_get.prototype.position = function( obj )
{
	var $left	= 0; 
	var $top	= 0;
	if (obj.offsetParent) {
		do {
			$left	+= obj.offsetLeft;
			$top	+= obj.offsetTop;
		} while (obj = obj.offsetParent);
		
		return [$left,$top];
	};
};



/*
 * Startup
 */
$(document).ready(function()
{
	if( typeof( set.tabbed ) !== 'undefined' ) set.tabbed();
	if( typeof( set.dropped ) !== 'undefined' ) set.dropped();
	
});

function strtotime (str, now) {
    // Convert string representation of date and time to a timestamp  
    // 
    // version: 1107.2516
    // discuss at: http://phpjs.org/functions/strtotime    // +   original by: Caio Ariede (http://caioariede.com)
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +      input by: David
    // +   improved by: Caio Ariede (http://caioariede.com)
    // +   improved by: Brett Zamir (http://brett-zamir.me)    // +   bugfixed by: Wagner B. Soares
    // +   bugfixed by: Artur Tchernychev
    // %        note 1: Examples all have a fixed timestamp to prevent tests to fail because of variable time(zones)
    // *     example 1: strtotime('+1 day', 1129633200);
    // *     returns 1: 1129719600    // *     example 2: strtotime('+1 week 2 days 4 hours 2 seconds', 1129633200);
    // *     returns 2: 1130425202
    // *     example 3: strtotime('last month', 1129633200);
    // *     returns 3: 1127041200
    // *     example 4: strtotime('2009-05-04 08:30:00');    // *     returns 4: 1241418600
    var i, match, s, strTmp = '',
        parse = '';
 
    strTmp = str;    strTmp = strTmp.replace(/\s{2,}|^\s|\s$/g, ' '); // unecessary spaces
    strTmp = strTmp.replace(/[\t\r\n]/g, ''); // unecessary chars
    if (strTmp == 'now') {
        return (new Date()).getTime() / 1000; // Return seconds, not milli-seconds
    } else if (!isNaN(parse = Date.parse(strTmp))) {        return (parse / 1000);
    } else if (now) {
        now = new Date(now * 1000); // Accept PHP-style seconds
    } else {
        now = new Date();    }
 
    strTmp = strTmp.toLowerCase();
 
    var __is = {        day: {
            'sun': 0,
            'mon': 1,
            'tue': 2,
            'wed': 3,            'thu': 4,
            'fri': 5,
            'sat': 6
        },
        mon: {            'jan': 0,
            'feb': 1,
            'mar': 2,
            'apr': 3,
            'may': 4,            'jun': 5,
            'jul': 6,
            'aug': 7,
            'sep': 8,
            'oct': 9,            'nov': 10,
            'dec': 11
        }
    };
     var process = function (m) {
        var ago = (m[2] && m[2] == 'ago');
        var num = (num = m[0] == 'last' ? -1 : 1) * (ago ? -1 : 1);
 
        switch (m[0]) {        case 'last':
        case 'next':
            switch (m[1].substring(0, 3)) {
            case 'yea':
                now.setFullYear(now.getFullYear() + num);                break;
            case 'mon':
                now.setMonth(now.getMonth() + num);
                break;
            case 'wee':                now.setDate(now.getDate() + (num * 7));
                break;
            case 'day':
                now.setDate(now.getDate() + num);
                break;            case 'hou':
                now.setHours(now.getHours() + num);
                break;
            case 'min':
                now.setMinutes(now.getMinutes() + num);                break;
            case 'sec':
                now.setSeconds(now.getSeconds() + num);
                break;
            default:                var day;
                if (typeof(day = __is.day[m[1].substring(0, 3)]) != 'undefined') {
                    var diff = day - now.getDay();
                    if (diff == 0) {
                        diff = 7 * num;                    } else if (diff > 0) {
                        if (m[0] == 'last') {
                            diff -= 7;
                        }
                    } else {                        if (m[0] == 'next') {
                            diff += 7;
                        }
                    }
                    now.setDate(now.getDate() + diff);                }
            }
            break;
 
        default:            if (/\d+/.test(m[0])) {
                num *= parseInt(m[0], 10);
 
                switch (m[1].substring(0, 3)) {
                case 'yea':                    now.setFullYear(now.getFullYear() + num);
                    break;
                case 'mon':
                    now.setMonth(now.getMonth() + num);
                    break;                case 'wee':
                    now.setDate(now.getDate() + (num * 7));
                    break;
                case 'day':
                    now.setDate(now.getDate() + num);                    break;
                case 'hou':
                    now.setHours(now.getHours() + num);
                    break;
                case 'min':                    now.setMinutes(now.getMinutes() + num);
                    break;
                case 'sec':
                    now.setSeconds(now.getSeconds() + num);
                    break;                }
            } else {
                return false;
            }
            break;        }
        return true;
    };
 
    match = strTmp.match(/^(\d{2,4}-\d{2}-\d{2})(?:\s(\d{1,2}:\d{2}(:\d{2})?)?(?:\.(\d+))?)?$/);    if (match != null) {
        if (!match[2]) {
            match[2] = '00:00:00';
        } else if (!match[3]) {
            match[2] += ':00';        }
 
        s = match[1].split(/-/g);
 
        for (i in __is.mon) {            if (__is.mon[i] == s[1] - 1) {
                s[1] = i;
            }
        }
        s[0] = parseInt(s[0], 10); 
        s[0] = (s[0] >= 0 && s[0] <= 69) ? '20' + (s[0] < 10 ? '0' + s[0] : s[0] + '') : (s[0] >= 70 && s[0] <= 99) ? '19' + s[0] : s[0] + '';
        return parseInt(this.strtotime(s[2] + ' ' + s[1] + ' ' + s[0] + ' ' + match[2]) + (match[4] ? match[4] / 1000 : ''), 10);
    }
     var regex = '([+-]?\\d+\\s' + '(years?|months?|weeks?|days?|hours?|min|minutes?|sec|seconds?' + '|sun\\.?|sunday|mon\\.?|monday|tue\\.?|tuesday|wed\\.?|wednesday' + '|thu\\.?|thursday|fri\\.?|friday|sat\\.?|saturday)' + '|(last|next)\\s' + '(years?|months?|weeks?|days?|hours?|min|minutes?|sec|seconds?' + '|sun\\.?|sunday|mon\\.?|monday|tue\\.?|tuesday|wed\\.?|wednesday' + '|thu\\.?|thursday|fri\\.?|friday|sat\\.?|saturday))' + '(\\sago)?';
 
    match = strTmp.match(new RegExp(regex, 'gi')); // Brett: seems should be case insensitive per docs, so added 'i'
    if (match == null) {
        return false;    }
 
    for (i = 0; i < match.length; i++) {
        if (!process(match[i].split(' '))) {
            return false;        }
    }
 
    return (now.getTime() / 1000);
}

function changeDateTo(date)
{
    var new_date      = date.split(".");

    //alert(new_date);
}
