$(function() {
	$('#header_date span').text(getDate());

	if ($('.cake-sql-log').length > 0) {
		$('.cake-sql-log').hide();
		$('<a href="#">Toggle Sql Log</a>')
			.insertBefore($('.cake-sql-log'))
			.click(function() {
				$('.cake-sql-log').toggle();
				return false;
			});
	}
	window.setTimeout(function() {
		$('ul.messages').fadeOut(function() {
			$('ul.messages').remove();
		});
	}, 4000);
});
$.extend({
	strrpos: function(haystack, needle, offset) {
		var i = haystack.lastIndexOf(needle, offset);
		return i >= 0 ? i : false;
	},
	url: function(url) {
		var base = arguments.callee.base
			? arguments.callee.base
			: $('base:first')
				.attr('href');
		return base+url.replace(/^\/+/, '');
	},
	explode: function(delimiter, string, limit) {
	    var emptyArray = { 0: '' };

		if (
			arguments.length < 2
			|| typeof arguments[0] == 'undefined'
			|| typeof arguments[1] == 'undefined'
		) {
			return null;
		}

		if (delimiter === '' || delimiter === false || delimiter === null) {
			return false;
		}

		if (
			typeof delimiter == 'function' ||
			typeof delimiter == 'object' ||
			typeof string == 'function' ||
			typeof string == 'object'
		) {
			return emptyArray;
		}

		if (delimiter === true) {
			delimiter = '1';
		}

		if (!limit) {
			return string.toString().split(delimiter.toString());
	    }

		var splitted = string.toString().split(delimiter.toString());
		var partA = splitted.splice(0, limit - 1);
		var partB = splitted.join(delimiter.toString());
		partA.push(partB);

		return partA;
	},
	ucfirst: function(string) {
		var val = string.split(' ');
		var result = '';

		for (var c = 0; c < val.length; c++) {
			result += val[c].substring(0, 1).toUpperCase() + val[c].substring(1, val[c].length);
			if (c < val.length - 1) {
				result = result + ' ';
			}
		}

		return result;
	}
});

function getDate() {
	var dayName = new Array('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday');
	var monName = new Array('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December');
	var now = new Date;
	return dayName[now.getDay()]+', '+monName[now.getMonth()]+' '+now.getDate()+', '+now.getFullYear();
}
function rateTextHover(t_id, _txt) {
	document.getElementById(t_id).innerHTML = _txt;
}
function rateTextDefault(id, _txt) {
	document.getElementById('r_txt'+id).innerHTML =_txt;
}
function rateIt(number, rate, text) {
	document.getElementById('m_txt'+number).style.display = 'block';
	document.getElementById('m_txt'+number).innerHTML = text;

	document.getElementById('q'+number).value = rate * 10;
	document.getElementById('r_txt'+number).style.display = 'none';
	rating = rate * 12;
	document.getElementById('current-rating'+number).style.width = rating+'px';
}

function sha1 ( str ) {
    // http://kevin.vanzonneveld.net
    // +   original by: Webtoolkit.info (http://www.webtoolkit.info/)
    // + namespaced by: Michael White (http://getsprink.com)
    // -    depends on: utf8_encode
    // *     example 1: sha1('Kevin van Zonneveld');
    // *     returns 1: '54916d2e62f65b3afa6e192e6a601cdbe5cb5897'

    var rotate_left = function(n,s) {
        var t4 = ( n<<s ) | (n>>>(32-s));
        return t4;
    };

    var lsb_hex = function(val) {
        var str="";
        var i;
        var vh;
        var vl;

        for( i=0; i<=6; i+=2 ) {
            vh = (val>>>(i*4+4))&0x0f;
            vl = (val>>>(i*4))&0x0f;
            str += vh.toString(16) + vl.toString(16);
        }
        return str;
    };

    var cvt_hex = function(val) {
        var str="";
        var i;
        var v;

        for( i=7; i>=0; i-- ) {
            v = (val>>>(i*4))&0x0f;
            str += v.toString(16);
        }
        return str;
    };

    var blockstart;
    var i, j;
    var W = new Array(80);
    var H0 = 0x67452301;
    var H1 = 0xEFCDAB89;
    var H2 = 0x98BADCFE;
    var H3 = 0x10325476;
    var H4 = 0xC3D2E1F0;
    var A, B, C, D, E;
    var temp;

    str = utf8_encode(str);
    var str_len = str.length;

    var word_array = new Array();
    for( i=0; i<str_len-3; i+=4 ) {
        j = str.charCodeAt(i)<<24 | str.charCodeAt(i+1)<<16 |
        str.charCodeAt(i+2)<<8 | str.charCodeAt(i+3);
        word_array.push( j );
    }

    switch( str_len % 4 ) {
        case 0:
            i = 0x080000000;
        break;
        case 1:
            i = str.charCodeAt(str_len-1)<<24 | 0x0800000;
        break;
        case 2:
            i = str.charCodeAt(str_len-2)<<24 | str.charCodeAt(str_len-1)<<16 | 0x08000;
        break;
        case 3:
            i = str.charCodeAt(str_len-3)<<24 | str.charCodeAt(str_len-2)<<16 | str.charCodeAt(str_len-1)<<8    | 0x80;
        break;
    }

    word_array.push( i );

    while( (word_array.length % 16) != 14 ) word_array.push( 0 );

    word_array.push( str_len>>>29 );
    word_array.push( (str_len<<3)&0x0ffffffff );

    for ( blockstart=0; blockstart<word_array.length; blockstart+=16 ) {
        for( i=0; i<16; i++ ) W[i] = word_array[blockstart+i];
        for( i=16; i<=79; i++ ) W[i] = rotate_left(W[i-3] ^ W[i-8] ^ W[i-14] ^ W[i-16], 1);

        A = H0;
        B = H1;
        C = H2;
        D = H3;
        E = H4;

        for( i= 0; i<=19; i++ ) {
            temp = (rotate_left(A,5) + ((B&C) | (~B&D)) + E + W[i] + 0x5A827999) & 0x0ffffffff;
            E = D;
            D = C;
            C = rotate_left(B,30);
            B = A;
            A = temp;
        }

        for( i=20; i<=39; i++ ) {
            temp = (rotate_left(A,5) + (B ^ C ^ D) + E + W[i] + 0x6ED9EBA1) & 0x0ffffffff;
            E = D;
            D = C;
            C = rotate_left(B,30);
            B = A;
            A = temp;
        }

        for( i=40; i<=59; i++ ) {
            temp = (rotate_left(A,5) + ((B&C) | (B&D) | (C&D)) + E + W[i] + 0x8F1BBCDC) & 0x0ffffffff;
            E = D;
            D = C;
            C = rotate_left(B,30);
            B = A;
            A = temp;
        }

        for( i=60; i<=79; i++ ) {
            temp = (rotate_left(A,5) + (B ^ C ^ D) + E + W[i] + 0xCA62C1D6) & 0x0ffffffff;
            E = D;
            D = C;
            C = rotate_left(B,30);
            B = A;
            A = temp;
        }

        H0 = (H0 + A) & 0x0ffffffff;
        H1 = (H1 + B) & 0x0ffffffff;
        H2 = (H2 + C) & 0x0ffffffff;
        H3 = (H3 + D) & 0x0ffffffff;
        H4 = (H4 + E) & 0x0ffffffff;
    }

    var temp = cvt_hex(H0) + cvt_hex(H1) + cvt_hex(H2) + cvt_hex(H3) + cvt_hex(H4);
    return temp.toLowerCase();
}

function base64_encode( data ) {
    // http://kevin.vanzonneveld.net
    // +   original by: Tyler Akins (http://rumkin.com)
    // +   improved by: Bayron Guevara
    // +   improved by: Thunder.m
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // -    depends on: utf8_encode
    // *     example 1: base64_encode('Kevin van Zonneveld');
    // *     returns 1: 'S2V2aW4gdmFuIFpvbm5ldmVsZA=='

    // mozilla has this native
    // - but breaks in 2.0.0.12!
    //if (typeof window['atob'] == 'function') {
    //    return atob(data);
    //}

    var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
    var o1, o2, o3, h1, h2, h3, h4, bits, i = ac = 0, enc="", tmp_arr = [];
    data = utf8_encode(data);

    do { // pack three octets into four hexets
        o1 = data.charCodeAt(i++);
        o2 = data.charCodeAt(i++);
        o3 = data.charCodeAt(i++);

        bits = o1<<16 | o2<<8 | o3;

        h1 = bits>>18 & 0x3f;
        h2 = bits>>12 & 0x3f;
        h3 = bits>>6 & 0x3f;
        h4 = bits & 0x3f;

        // use hexets to index into b64, and append result to encoded string
        tmp_arr[ac++] = b64.charAt(h1) + b64.charAt(h2) + b64.charAt(h3) + b64.charAt(h4);
    } while (i < data.length);

    enc = tmp_arr.join('');

    switch( data.length % 3 ){
        case 1:
            enc = enc.slice(0, -2) + '==';
        break;
        case 2:
            enc = enc.slice(0, -1) + '=';
        break;
    }

    return enc;
}

function utf8_encode ( string ) {
    // http://kevin.vanzonneveld.net
    // +   original by: Webtoolkit.info (http://www.webtoolkit.info/)
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: sowberry
    // +    tweaked by: Jack
    // +   bugfixed by: Onno Marsman
    // +   improved by: Yves Sucaet
    // +   bugfixed by: Onno Marsman
    // *     example 1: utf8_encode('Kevin van Zonneveld');
    // *     returns 1: 'Kevin van Zonneveld'

    string = (string+'').replace(/\r\n/g, "\n").replace(/\r/g, "\n");

    var utftext = "";
    var start, end;
    var stringl = 0;

    start = end = 0;
    stringl = string.length;
    for (var n = 0; n < stringl; n++) {
        var c1 = string.charCodeAt(n);
        var enc = null;

        if (c1 < 128) {
            end++;
        } else if((c1 > 127) && (c1 < 2048)) {
            enc = String.fromCharCode((c1 >> 6) | 192) + String.fromCharCode((c1 & 63) | 128);
        } else {
            enc = String.fromCharCode((c1 >> 12) | 224) + String.fromCharCode(((c1 >> 6) & 63) | 128) + String.fromCharCode((c1 & 63) | 128);
        }
        if (enc != null) {
            if (end > start) {
                utftext += string.substring(start, end);
            }
            utftext += enc;
            start = end = n+1;
        }
    }

    if (end > start) {
        utftext += string.substring(start, string.length);
    }

    return utftext;
}

$.fn.field = function(field, val, accessor, map) {
	var r = [], one = (this.length == 1), get = true, fields = field, customAccessor = !!accessor, customMap = map;
	var multi = (field.constructor == Array)
		? 'get'
		: (typeof fields == 'object')
			? 'set'
			: false;
	if (multi == 'get') {
		fields = {};
		$.each(field, function() {
			fields[this] = undefined;
		});
	} else if (multi == false) {
		fields = {}
		fields[field] = val;
	}
	this.each(function(i) {
		map = customMap || $.data(this, 'fields');
		var $this = $(this), self = this;
		for (var f in fields) {
			var v = fields[f];
			accessor = accessor || {
				get: function(f) {return map[f].get.call(this);},
				set: function(f, v) {map[f].set.call(this, v)}
			};
			if (get = get && (typeof v == 'undefined')) {
				if (multi == 'get') {
					r[i] = r[i] || {};
					r[i][f] = accessor.get.call($this, f);
				} else {
					r.push(accessor.get.call($this, f));
				}
			} else {
				accessor.set.call($this, f, v);
				if (!customAccessor && 'Page' in window) {
					Page.trigger('changeField', [$this, f, v]);
				}
			}
		}
	});
	return (!get)
		? this
		: (one)
			? r[0]
			: r;
};

$.fn.semantic = function(options, key, val) {
	if (typeof options == 'string') {
		val = key;
		key = options;
		options = undefined;
	}

	arguments.callee.helpers = arguments.callee.helpers || {
		get: function(key, options) {
			var m = (this.attr(options.attr) || "").match(options.regex);
			return (m)
				? m[1]
				: false;
		},
		set: function(key, val, options) {
			var attrVal = this.attr(options.attr) || "", newAttrVal;
			if ((newAttrVal = attrVal.replace(options.regex, key+'-'+val)) == attrVal && !options.regex.test(attrVal)) {
				newAttrVal = (attrVal)
					? attrVal+' '+key+'-'+val
					: key+'-'+val;
			}
			this.attr(options.attr, newAttrVal);
		}
	};
	options = $.extend({
		attr: 'class',
		get: arguments.callee.helpers.get,
		set: arguments.callee.helpers.set,
		regex: new RegExp(key+'-([^\\s]+)')
	}, options || {});

	return this.field(key, val, {
		get: function(k) {return options.get.call(this, k, options);},
		set: function(k, v) {options.set.call(this, k, v, options);}
	}, {});
};

$.httpSerialize = function(items, parentName) {
	var serializedItems = [], serialize = arguments.callee, encodeItem =  function(key, value) {
		if (value === null || typeof value == 'undefined') return value;
		if (value.constructor == Array) {return serialize(value, key);}
		return (value.constructor == Object)
			? serialize(value, key)
			: (value === true || value === false)
				? key+"="+new Number(value)
				: key+"="+encodeURIComponent(value);
	};

	if (items.constructor == Array)  {
		parentName = parentName || 'item';
		for (var i = 0; i < items.length; i++) {
			var key = parentName+'['+i+']', value = items[i];
			serializedItems.push(encodeItem(key, value));
		}
	} else {
		parentName = parentName || '';
		for (var key in items) {
			var value = items[key];
			if (parentName) {
				serializedItems.push(encodeItem(parentName+'['+encodeURIComponent(key)+']', value));
			} else {
				serializedItems.push(encodeItem(encodeURIComponent(key), value));
			}
		}
	}
	return serializedItems.join("&");
};

// Copyright (c) 2007-2008 Josh Bush (digitalbush.com) (MIT licensed) -- Part of the masked input plugin
// refactored by Felix Geisendörfer
$.fn.caret = function(begin,end) {
	if (this.length == 0) {
		return;
	}

	if (typeof begin == 'number') {
        end = (typeof end == 'number')
			? end
			: begin;

		return this.each(function() {
			if (this.setSelectionRange){
				this.focus();
				this.setSelectionRange(begin,end);
			} else if (this.createTextRange) {
				var range = this.createTextRange();
				range.collapse(true);
				range.moveEnd('character', end);
				range.moveStart('character', begin);
				range.select();
			}
		});
	}

	if (this[0].setSelectionRange) {
		begin = this[0].selectionStart;
		end = this[0].selectionEnd;
	} else if (document.selection && document.selection.createRange) {
		var range = document.selection.createRange();
		begin = 0 - range.duplicate().moveStart('character', -100000);
		end = begin + range.text.length;
	}

	return {begin:begin, end:end};
};
