/*
 *	MochiKit Compatibility "library"
 *
 *	REQUIRES: jquery.js
 */

// STUPID hack for arrange.js
var _no_global_dollar_override = true;
var mochi_compat = {};
mochi_compat.debug = false;
mochi_compat.unsafe_innerhtml = false;

var $j = function(expression, context) {
	return $('#' + expression, context)[0];
};

var $m = function(expression, context) {
	return $j(expression, context);
};

var jq = function(expression, context) {
	return $j(expression, context);
};

var getObject = function(expression, context) {
	return $j(expression, context);
};

if (typeof(_globals) == 'undefined')
	var _globals = {};
_globals['_mochi_load_events'] = [];

var addLoadEvent = function(fcn) {
	if (_globals['_mochi_load_events']) 
		_globals['_mochi_load_events'].push(fcn);
};

jQuery(document).ready(function() {
	for (var i = 0; i < _globals['_mochi_load_events'].length; ++i)
		if ($.isFunction(_globals['_mochi_load_events'][i])) _globals['_mochi_load_events'][i]();
	}
);

var asyncAction = function(command, parameters, callback) {
	var url = '/' + command;
	/* Special case for asyncAction() calls inside Facebook applications */
	if (parameters['fb_uid'] || parameters['fb_session_key'] || self.url_parameters.get('fb_sig_user') || self.url_parameters.get('user_token'))
	{
		parameters['fb_sig_user'] = self.url_parameters.get('fb_sig_user') || 0;
		parameters['fb_sig_session_key'] = self.url_parameters.get('fb_sig_session_key') || '';
		parameters['user_token'] = self.url_parameters.get('user_token') || '';
		parameters['fb_uid'] = 0;
		parameters['fb_session_key'] = '';
	}
	return jQuery.post(url, parameters, callback);
};

var __bindable_attrs = ['onclick','onmouseover','onmouseout','onfocus','onblur','onkeypress','onkeydown','onkeyup','onchange'];

/*
 *	_safeAttributeSet handles some of the nuances of DOM element creation across browsers
 *	Unless you discuss your changes with tyler@ or sergio@ please treat this as "core"
 *	Javascript code and don't change it (a lot depends on these 10 lines
 */
/* 
*	-- additional notes: IF YOU RUN THROUGH THIS FOR BINDING... (1) it only allows lowercase binds to be created 
*		(2) it strips the first two characters off (so start yours with on for creation but no 'on' when referenced)
*/
var _safeAttributeSet = function(_e, attr, val) {
	var attr_l = attr.toLowerCase();
	if (attr_l == 'class') {
		$(_e).addClass(val);
		return;
	}
	/*
	 *	jQuery bind() syntax is such that "onclick" events are bound as $.bind('click', function)
	 *	thus the substr(2) bits
	 */
	if (typeof(val) == 'function')
		$(_e).bind(attr_l.substr(2), val);
	else if ($.inArray(attr_l, __bindable_attrs) >= 0)
		_e[attr_l] = function() { var _f = new Function(val); return _f.call(_e); };
	else
		$(_e).attr(attr_l, val);
};


var createDOM = function(n, attrs) {
	// ie doesn't deal well with dynamically created radio buttons
	if ($.browser.msie && n == 'input' && attrs && 'type' in attrs && attrs['type'].toLowerCase() == 'radio' && 'name' in attrs)
		var _e = document.createElement('<input type="radio" name="' + attrs['name'] + '">');
	else
		var _e = document.createElement(n);
	for (var attr in attrs) 
		_safeAttributeSet(_e, attr, attrs[attr]);
	if ( (arguments != null) && (arguments.length > 2) ) {
		var node_args = arguments[2];
		node_args = createDOM.flatten_array(node_args);
		for (var i = 1; i <  node_args.length; ++i) {
			if (typeof(node_args[i]) == 'function')
				_e.appendChild(node_args[i]());
			else if (typeof(node_args[i]) == 'number')
				_e.appendChild(document.createTextNode(node_args[i]));
			else if ( (node_args[i] != null) && (typeof(node_args[i]) == 'object') ) 
				_e.appendChild(node_args[i]);
			else if (typeof(node_args[i]) == 'string')
				try {
					if (mochi_compat.unsafe_innerhtml)
						_e.appendChild(document.createTextNode(createDOM.unescape_HTML(node_args[i])));
					else
						_e.appendChild(document.createTextNode(createDOM.unescape_HTML(node_args[i].replace(/</g, '&lt;').replace(/>/g, '&gt;'))));
				} catch (ex) {
					if (mochi_compat.debug)
						alert('Failed to set ' + n + '.innerHTML in IE (you cannot insert a block element into a non-block element');
					_e.appendChild(document.createTextNode(node_args[i]));
				}
			}
		}
	return _e;
};
createDOM.unescape_HTML = function( escaped ){
	var node = document.createElement("div");
	node.innerHTML = escaped;
	if( node.innerText !== undefined ){ return node.innerText;   } // Internet explorer
	else                              { return node.textContent; } // Firefox
}
createDOM.flatten_array = function( structure ){
  if( ! structure ){ return structure; }
  if( ! structure.slice ){ structure = Array.prototype.slice.call(structure); } // turn array-like objects into array objects
  var element, is_array_like, i, head, tail;
  for( i = 0; i < structure.length; i++ ){
    element = structure[i];
    /// checking wheter element is flattenable (array-like)
    if( typeof(element) !== 'object' ){ continue; } // do not flatten non-objects
    if( ! element ){ continue; } // do not flatten nulls
    if( element.nodeType ){ continue; } // do not flatten dom elements
    if( element.length === undefined ){ continue; } // do not flatten objects without a length
    if( element.propertyIsEnumerable('length') && !element.jquery ){ continue; } // do not flatten objects with lenght properties that aren't builtin (except jquery objects)
    head = structure.slice(0,i);
    element = Array.prototype.slice.call(element); // convert array-like elements to arrays
    tail = structure.slice(i+1,structure.length);
    structure = head.concat(element).concat(tail); // flattening
  }
  return structure;
};



var _nodes = ['table', 'thead', 'tbody', 'tfoot', 'th', 'tr', 'td', 'a', 'strong', 'div', 'img', 'br', 'span', 'li', 'ul', 'ol', 'iframe', 'textarea', 'input', 'label', 'label', 'p', 'form', 'em', 'object', 'param', 'embed', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6','small','big','blockquote','button','center', 'label', 'dl', 'dt', 'dd', 'q', 'select', 'option', 'b'];
for (var i = 0; i < _nodes.length; i++)  
	eval('function ' + _nodes[i].toUpperCase() + '(attrs) { return createDOM("' + _nodes[i] + '", attrs, arguments); }');


var appendChildNodes = function(parentNode) {
	for (var i = 1; i < arguments.length; i++) 
		$(parentNode).append(arguments[i]);
};

var replaceChildNodes = function(parentNode, childNode) {
	$(parentNode).empty();
	$(parentNode).append(childNode);
};

var replaceChildren = function(parentNode, childNode) {
	parentNode.empty();
	parentNode.append(childNode);
};

var repr = function(s) {
	if (s && s.repr) {
		return s.repr();
	} else if (typeof(s) == 'string') {
		return s;
	}
	return '';
};

var serializeJSON = function(o) {
	return $.toJSON(o);
};

var evalJSON = function() {
	return eval("(" + arguments[0] + ")");
};

var map = function(fcn, lst) {
	return $.map(lst, fcn);
};

var list = function(l) {
	return map(function(e) { return e; }, l);
};

var FormHandler = function() {
	this._form = new Object();
	var query = location.search.replace(/^\?/,'');
	query = query.replace(/\&$/,'');
	var t = this;
	jQuery.each(query.split('&'), function(index) {
		var key = this.split('=')[0];
		var val = this.split('=')[1];
		if (val) { t._form[key] = val; }
	});
};
FormHandler.prototype.get = function(m) { return this._form[m]; };
self.url_parameters = new FormHandler();
