/*
// A123 UI Engine (Raptor)
// Developed By
// Alex Vaos
// avaos@auction123.com
// 
// REQUIRES:
// jquery
*/

(function($){
	
	// UTILITIES
	var debug = function(text,type) {
		if (window.console && window.console.log) {
			if(type == 'info' && window.console.info) {
				window.console.info(text);
			}
			else if(type == 'warn' && window.console.warn) {
				window.console.warn(text);
			}
			else {
				window.console.log(text);
			}
		}
	};
	
	var run = function(code) {
		try {
			return new Function("return " + code)();
		} catch (e) {
			debug("RAPTOR - RUN ERROR");
		}
	};
	
	
	$.fn.raptor = function(options) {
		
		var _d = {
			name: null,
			type: null, // TYPES: textbox, button, select, listPanel, panel, colorSwatch, checklist
			prefix: null,
			me: "raptor",
			t: this,
			selector: this.selector
		};
		if (typeof(options) == "string") {
			// SET TYPE
			options = {
				type: options
			};
		}
		var _o = $.extend({}, _d, options);
		
		var _rap = function(name, w, tag) {
			tag = tag || "div";
			//var e = $("<" + tag + " class=\"" + _o.prefix + "-" + name + "\">");
			w.wrapInner(_create(name, tag));
			return w.find(tag + "." + _o.prefix + "-" + name);
		};
		
		var _create = function(cls, tag) {
			tag = tag || "div";
			//if (jQuery.browser.msie) return $("<" + tag + " class=\"" + _o.prefix + "-"  + cls + "\">&nbsp;</" + tag + ">");
			return $("<" + tag + " class=\"" + _o.prefix + "-"  + cls + "\"></" + tag + ">");
		};
	
		return this.each(function(){
			
			var _c = {}; // CONTROLS
			var _p = {}; // PRIVATES
			_p.types = ["listSelect", "listPanel", "listAlt", "list-doubleborder", "panel-rounded", "panel-secondbg", "colorSwatch", "checklist", "tabs", "textbox", "button", "select", "panel"];
			_c.self = this;
			
			var _init = function() {
				
				_c.self = jQuery(_c.self);
				
				// FIND OUT TYPE
				if (_o.type === null) {
					
					for (i = 0; i < _p.types.length; i++) {
						if (_o.selector.indexOf(_p.types[i]) != "-1") {
							_o.type = _p.types[i];
							break;
						}						
					}
					if (_o.type) debug("RAPTOR - NO TYPE SELECTED: " + _o.selector + " - DETERMINED AS: " + _o.type);
					else debug("RAPTOR - NO TYPE FOUND: " + _o.selector);
				}
				if (_o.type === null) {
					return;	
				}
				
				
				
				//if (_o.name == null) _o.name = _c.self.attr("class");
				if (_o.name == null) _o.name = _o.me + "-" + _o.type;
				if (_o.prefix == null) _o.prefix = _o.type;
				
				if (!_c.self.hasClass(_o.name + "-styled")) {
					_c.self.addClass(_o.name + "-styled");
					if (jQuery.browser.msie) _c.self.addClass(_o.me + "-ie");
					_initStyle();
				}
			
			};
			
			
			var _initStyle = function(type) {
				
				var _p = _p || {};
				
				switch (_o.type) {
					
					case "listSelect":
					
						_o.transitionSpeed = _o.transitionSpeed || 400;
					
						_c.select = _c.self;
					
						// ADD CONTAINER
						_c.ctn = $("<div class=\"" + _o.name + "\">");
						_c.select.wrap(_c.ctn);
						_c.ctn = _c.select.parent();
						
						_c.opts = _c.select.find("option");
						_c.opts.each(function(){
							
							var t = jQuery(this);
							
							var a = jQuery("<a href=\"javascript: void(0)\">" + t.text() + "</a>");
							_c.ctn.append(a);
							
							a.click(function() {
								var s = jQuery(this);
								s.siblings().removeClass("active");
								s.addClass("active");
							});
							
						});
						_c.optionLinks = _c.ctn.find("a");
						
						// CREATE SELECTOR
						_c.selector = jQuery("<div class=\"" + _o.prefix + "-selector\"><div class=\"" + _o.prefix + "-selector-left\"><div class=\"" + _o.prefix + "-selector-right\"><div class=\"" + _o.prefix + "-selector-bg\">&nbsp;</div></div></div>");
						_c.ctn.append(_c.selector);
						
						_c.ctn.append("<div class=\"clear\"></div>");
						
						// OPTION LINKS
						_c.optionLinks.click(function() {
							// if (_p.intrans) return;
							
							var t = jQuery(this);
							t.siblings().removeClass(_o.prefix + "-active");
							
							// START ANIMATION
							//_p.ctnOffset = _c.ctn.offset().top; // GET OFFSET
							var top =  t.offset().top - _c.ctn.offset().top;
							//debug(top);
							_c.selector.animate({ "top": top }, {"duration" : _o.transitionSpeed, "queue": false});
							
							t.addClass(_o.prefix + "-active");
							
						});
						
						// PRIVATE DATA
						
						//_p.ctnOffset = _c.ctn.offset().top;
						
						//_c.sections.hide();		
						
						// INITIATE FIRST IF EXISTS
						//_p.selectedSection = _c.sections.first();	
						var _firstTab = _c.optionLinks.find(_o.prefix + "-active");
						if (!(_firstTab.length > 0)) {
							_firstTab = _c.optionLinks.first();
						}
						_firstTab.trigger('click');
					
					
						break;
					
					case "textbox":
						_c.ctn = $("<div class=\"" + _o.name + "\">");
						
						_c.self.wrap(_c.ctn);
						
						_c.ctn = _c.self.parent();
						
						_c.self.wrap("<div class=\"" + _o.prefix + "-bg\">");
						_c.ctn.prepend("<div class=\"" + _o.prefix + "-left\">");
						_c.ctn.append("<div class=\"" + _o.prefix + "-right\">");
						
						break;
						
					case "button":
					
						_c.self.addClass(_o.name);
						
						_c.bg = _rap("bg", _c.self, "span");
						//if (jQuery.browser.msie) _c.bg = _c.self.find("span." + _o.prefix + "-bg");
						
						_c.contents = _rap("contents", _c.bg, "span");
						//_c.contents = $("<span class=\"" + _o.prefix + "-contents\">");
						//_c.bg.wrapInner(_c.contents);
						
						_c.self.prepend("<span class=\"" + _o.prefix + "-left\">&nbsp;</span>");
						_c.self.append("<span class=\"" + _o.prefix + "-right\">&nbsp;</span>");
						_c.self.append("<span class=\"" + _o.prefix + "-clear\">&nbsp;</span>");
						
						break;
						
					case "select":
					
						_c.ctn = $("<div class=\"" + _o.name + "\">");
						
						_c.self.wrap(_c.ctn);
						
						_c.ctn = _c.self.parent();
						
						//_c.self.wrap("<div class=\"" + _o.prefix + "-bg\">");
						_c.label = jQuery("<div class=\"" + _o.prefix + "-label\">");
						_c.ctn.prepend(_c.label);
						
						_c.ctn.prepend("<div class=\"" + _o.prefix + "-right\">");
						_c.ctn.prepend("<div class=\"" + _o.prefix + "-left\">");
						
						// EVENTS
						_c.self.change(function() {
							_c.label.html(_c.self.find('option:selected').html());
						});
						_c.self.trigger("change");

						
						break;
						
					case "listPanel":
					
						_c.ctn = $("<div class=\"" + _o.name + "\">");
						
						_c.self.wrap(_c.ctn);
						
						_c.ctn = _c.self.parent();
						
						_counter = 0;
						
						_c.self.find("li").each(function() {
							
							var t = jQuery(this);
							
							_counter++;
							if (_counter % 2 == 0) t.addClass(_o.prefix + "-alt");
							t.append("<span class=\"clear\"></span>");
							
						});
					
					
					
						break;
						
					case "listAlt":
						
						_counter = 0;
						_c.self.find("li").each(function() {
							
							var t = jQuery(this);
							
							_counter++;
							if (_counter % 2 == 0) t.addClass(_o.prefix + "-alt");
							t.append("<span class=\"clear\"></span>");
							
						});
						
						break;
						
					case "list-doubleborder":
						
						_c.self.find("li").each(function() {
							
							jQuery(this).wrapInner("<span class=\"" + _o.prefix + "-secondborder\">");
							
						});
						
						break;
						
					case "panel-secondbg":
					
						_c.bg2 = _create("bg2");
						_c.self.wrapInner(_c.bg2);
						
						break;
						
					case "panel":
						// REWRITE
						
						_c.bg = $("<div class=\"" + _o.prefix + "-bg\">");
						_c.self.wrapInner(_c.bg);
						_c.contents = $("<div class=\"" + _o.prefix + "-contents\">");
						_c.bg = _c.self.find("div." + _o.prefix + "-bg");
						_c.bg.wrapInner(_c.contents);
						_c.self.prepend("<div class=\"" + _o.prefix + "-left\">");
						_c.self.append("<div class=\"" + _o.prefix + "-right\">");
						
						break;
						
					case "panel-rounded":
					
						// _c.self // CONTENTS
						_c.self.addClass(_o.name);
						
						_c.center = _rap("center", _c.self);
						
						_c.left = _rap("l", _c.center);
						
						_c.right = _rap("r", _c.left);
						
						_c.bg = _rap("bg", _c.right);
						
						_c.contents = _rap("contents", _c.bg);
						
						_c.self.prepend("<div class=\"" + _o.prefix + "-top\"><div class=\"" + _o.prefix + "-tl\"><div class=\"" + _o.prefix + "-tr\"><div class=\"" + _o.prefix + "-t\"></div></div></div></div>");
						_c.self.append("<div class=\"" + _o.prefix + "-bottom\"><div class=\"" + _o.prefix + "-bl\"><div class=\"" + _o.prefix + "-br\"><div class=\"" + _o.prefix + "-b\"></div></div></div></div>");
						
						break;
						
						
					case "colorSwatch":
					
						if (_c.self.is("select")) {
					
							_c.select = _c.self;
							
							// CREATE CONTAINER
							_c.ctn = $("<div class=\"" + _o.name + "\">");
							_c.select.wrap(_c.ctn);
							_c.ctn = _c.select.parent();
							
						}
						// DIV
						else {
							_c.ctn = _c.self;
							_c.select = _c.self.find("select");
						}
						
						_c.opts = _c.select.find("option");
						
						// CREATE MOUSE OVERS
						var ft = _c.opts.first().attr("title"); // FIRST TITLE
						//debug(_c.opts.first().text());
						if (ft.length > 0) {
							ft = run(ft);
							
							_c.fieldsCtn = _create("titleFields");
							_c.ctn.prepend(_c.fieldsCtn);
							
							// CREATE TITLE FIELDS
							_c.fields = [];
							jQuery.each(ft, function(k) {
								var th;
								_c.fields.push(th = _create("titleField"));
								_c.fieldsCtn.append(th);
							});
						}
						_c.label = _c.ctn.find("." + _o.prefix + "-label");
						
						// CREATE SWATCHES
						_c.swatches = _create("swatches");
						_c.ctn.prepend(_c.swatches);
						
						_c.opts.each(function(){
							
							var t = jQuery(this);
							
							var a = jQuery("<a href=\"javascript: void(0)\" style=\"background-color: " + t.attr("value") + "\" title=\"" + t.attr("title") + "\"> </a>");
							a.append(_create("innerborder", "span").text(t.text()));
							_c.swatches.append(a);
							
							a.click(function() {
								var s = jQuery(this);
								s.siblings().removeClass("active");
								s.addClass("active");
								
								if (_c.label.length) _c.label.val(s.text());
							});
							
							a.hover(
								function() {
									var ft = jQuery(this).attr("title");
									ft = run(ft);
									var fc = 0; //FIELD COUNTER
									jQuery.each(ft, function(k) {
										_c.fields[fc].text(k + ": " + ft[k]);
										//debug(ft[fc]);
										fc++;
									});
								},
								function() {
									jQuery.each(_c.fields, function(k) {
										_c.fields[k].html("&nbsp;");
									});
								}
							);
							
						});
						
						_c.swatches.append("<div class=\"clear\"></div>");		
					
						
					
						break;
						
						
					case "checklist":
					
						_o.editable = _o.editable || true;
					
						_c.opts = _c.self.find("input[type=checkbox]");
						
						_counter = 0;
						
						_c.opts.each(function(){
							
							var t = jQuery(this);
							
							var l = t.parent();
							
							var f = $("<div class=\"" + _o.prefix + "-field\">"); //FIELD
							
							// IF IT HAS A LABEL
							if (l.is("label")) {
								
								// WRAP LABEL
								l.wrap(f);
								f = l.parent();
								
								// MOVE INPUTS IF THEY EXIST
								var i = l.find("input[type=text]");
								f.append(i);
								
							} else {
								t.wrap(f);
								f = t.parent();
							}
							
							_counter++;
							if (_counter % 2 == 0) f.addClass(_o.prefix + "-alt");
								
							// CHANGE SPANS TO INPUTS IF THEY EXIST
							var s = l.find("span");
							if (_o.editable) {
								s.each(function(){
									var th = jQuery(this);
									f.append("<input type=\"text\" class=\"" + _o.prefix + "-textinput\" name=\"" + th.attr("title") + "\" value=\"" + th.html() + "\" />");
								});
							} else {
								f.append(s);
							}
							
							// ADD STYLING
							var action = $("<a class=\"" + _o.prefix + "-checkbox\">&nbsp;</a>");
							action.click(function(){
								// TOGGLE CHECK
								if (t.attr("checked")) {
									action.removeClass("checkbox-checked");
									t.attr("checked", false);
								} else {
									action.addClass("checkbox-checked");
									t.attr("checked", "checked");
								}
							});
							f.prepend(action);
							
							f.append("<div class=\"clear\">");
							
						});
					
						break;
						
						
					case "customOptions":
					
						_o.editable = _o.editable || true;
					
						var _updateFields = function() {
							_c.fields = _c.optionsCtn.find("div." + _o.prefix + "-field");
							_c.fields.removeClass(_o.prefix + "-alt");
							_c.fields.each(function(k){
								if (k % 2 == 1) jQuery(this).addClass(_o.prefix + "-alt");
							});
						};
						
						var _addField = function(elementOrValue) {
							var t = elementOrValue; // ELEMENT
							
							// EACH FIELD HAS 4 PARTS
							// label(checkbox), textCtn, a.closeButton, clear
							
							var f = _create("field");
							
							var val;
							
							// OBJECT
							if (typeof(t) != "string") {
							
								var l = t.parent();
								
								// IF IT HAS A LABEL
								if (l.is("label")) {
									
									// WRAP LABEL
									l.wrap(f);
									f = l.parent();
									
									// MOVE INPUTS IF THEY EXIST
									var i = l.find("input[type=text]");
									f.append(i);
									
								} else {
									t.wrap(f);
									f = t.parent();
								}
								
								_counter++;
								if (_counter % 2 == 0) f.addClass(_o.prefix + "-alt");
								
								val = jQuery.trim(l.text());
							
							}
							// t is STRING (VALUE)
							else {
								val = elementOrValue; // VALUE
								
								_c.optionsCtn.append(f);
								
								// LABEL / CHECKBOX
								var l = jQuery("<label>");
								f.append(l);
							
							}
							
							// CHECKBOX
							var checkbox = f.find("input[type=checkbox]");
							if (checkbox.length > 0) {
								checkbox.attr("checked", "checked");
								checkbox.attr("name", _p.name);
							} else {
								debug("RAPTOR - CREATING CHECKBOX");
								checkbox = jQuery("<input type=\"checkbox\" name=\"" + _p.name + "\" value=\"" + val + "\" checked=\"checked\" />");
								l.append(checkbox);
								debug(checkbox);
							}
							
							debug(val);
							
							// TEXTBOX
							// textbox = $("<input type=\"text\" class=\"" + _o.prefix + "-textbox\" name=\"" + _p.name + "\" value=\"" + l.text() + "\" />");
							var textCtn = _create("textCtn");
							f.append(textCtn);
							var textInput = jQuery("<input type=\"text\" class=\"" + _o.prefix + "-textInput\" name=\"" + _p.name + "\" value=\"" + val + "\" />");
							textCtn.append(textInput);
							var textbox;
							textCtn.append(textbox = _create("textbox"));
							
							var _focus = function() {
								//textbox.hide();
								//textInput.show();
								textCtn.addClass(_o.prefix + "-editing");
								textInput.focus();
								_p.editing = true;
								//debug("focus");
							};
							var _blur = function() {
								textCtn.removeClass(_o.prefix + "-editing");
								_p.editing = false;
								var v = textInput.val();
								textbox.text(v);
								checkbox.val(v);
								//debug("blur");
							};
							
							if (_o.editable) {
								// TEXTBOX ACTIONS	
								textCtn.click(function() {
									if (!_p.editing) {
										_focus();
									}
								});
								textInput.blur(_blur);
								textInput.keyup(function(e){
									if (e.which == 13) { //ENTER
										_blur();
									}
									e.handled = true;
								});
							}
							
							_blur();			
							
							
							// XBOX
							var action = _create("xbox", "a");
							action.click(function(){
								// TOGGLE CHECK
								f.slideUp(200, function() {
									f.remove();
									_updateFields();
								});
							});
							f.append(action);
							
							f.append("<div class=\"clear\">");
						}
					
					
						// START
					
						_c.opts = _c.self.find("input[type=checkbox]");
						
						_c.ctn = _c.self;
						
						_c.optionsCtn = _rap("optionsCtn", _c.ctn);
						
						_p.name = _c.opts.first().attr("name");
						
						_counter = 0;
						
						_c.opts.each(function(){
							
							_addField(jQuery(this));
							
						});
						
						
						
						// CREATE ADD FIELD
						var f = _create("addField");
						_c.ctn.append(f);
						
						var textInput = jQuery("<input type=\"text\" class=\"" + _o.prefix + "-textInput\" name=\"" + _p.name + "\" value=\"\" />");
						f.append(textInput);
						
						textInput.keyup(function(e){
							if (e.which == 13) { //ENTER
								_addEditable();
							}
							e.handled = true;
						});
						
						var _addEditable = function() {
							// textInput
							_addField(textInput.val());								
								
							//
							_updateFields();
							_c.optionsCtn.scrollTop(1000); // SCROLL DOWN
							textInput.val(""); // CLEAR					
						};
						
						
						
						debug(_c.opts);
					
						break;
						
						
					///////// TABS
					
					case "tabs" :
					
						// DEFAULTS
						
						_o = $.extend(_o, {
							transition: true,
							transitionSpeed: 300
						});
						
						// PRIVATES
						var _p = {};
						
						_p.transitioning = false;
						_p.selectedSection = 0;
						
						
						// START
						_c.self.addClass(_o.name);
						
						// FIND SECTIONS
						_c.sections = _c.self.find("." + _o.prefix + "-section[title]");
						
						// IF SECTIONS CANT BE FOUND, USE CHILDREN
						if (!(_c.sections.length > 0)) {
							_c.sections = _c.self.children();
							_c.sections.addClass(_o.prefix + "-section");
						} else {
							_c.sections = _c.sections.first().parent().children("." + _o.prefix + "-section[title]");
						}
						//debug(_c.sections);
						
						// WRAP SECTIONS IN CONTENT
						_c.content = _c.self.find("." + _o.prefix + "-content");
						if (!(_c.content.length > 0)) {
							_c.content = jQuery("<div>").addClass(_o.prefix + "-content");
							_c.self.append(_c.content);
							
							// MOVE SECTIONS
							_c.content.append(_c.sections);
						}
						
						// CREATE TAB NAV
						_c.nav = _c.self.find("." + _o.prefix + "-nav");
						if (!(_c.nav.length > 0)) {
							_c.nav = jQuery("<div>").addClass(_o.prefix + "-nav");
							_c.self.prepend(_c.nav);
						}
						
						// NAV BUTTONS
						_c.navButtons = _c.nav.find("a");
						
						if (!(_c.navButtons.length > 0)) {
							// CREATE TABS
							_c.sections.each(function() {
								_c.nav.append("<a href='javascript: void(0);'><span class=\"" + _o.prefix + "-left\"></span><span class=\"" + _o.prefix + "-bg\"><span class=\"" + _o.prefix + "-nav-content\">" + jQuery(this).attr("title") + "</span></span><span class=\"" + _o.prefix + "-right\"></span></a>");
							});
							_c.nav.append("<div class=\"clear\"></div>");
							
						}
						
						_c.navButtons = _c.nav.find("a"); // UPDATE AFTER ADDING ANCHORS
						
						_c.navButtons.click(function() {
							//if (_p.transitioning) return;
							var t = jQuery(this);
							_c.nav.find("a").removeClass(_o.prefix + "-active");
							t.addClass(_o.prefix + "-active");
							
							// GET TITLE NAME
							var title = t.find("." + _o.prefix + "-nav-content").text();
						
							// FIND SECTION
							var nextSection = _c.sections.filter("[title='" + title + "']");
							//var nextSection = _c.content.find("." + _o.prefix + "-section[title=" + title + "]");
							//debug(nextSection);
							
							if (nextSection.length == 0) {
								debug("Section not found");
								//debug(nextSection);
							}
							
							if (!_p.selectedSection) _p.selectedSection = nextSection;
							else if (_p.selectedSection.attr("title") == nextSection.attr("title")) return;
							
							
							if (_o.transition) {
								_p.transitioning = true;
								_p.selectedSection.fadeOut(_o.transitionSpeed/2, function() {
									_p.selectedSection = nextSection;
									_p.transitioning = false;
									nextSection.fadeIn(_o.transitionSpeed);
								});
							} else {
								_p.selectedSection = nextSection;
								_p.selectedSection.hide();
								nextSection.show();
							}
						});
						
						_c.sections.hide();		
						
						// INITIATE FIRST IF EXISTS
						//_p.selectedSection = _c.sections.first();	
						var _firstTab = _c.navButtons.find("." + _o.prefix + "-active");
						if (!(_firstTab.length > 0)) {
							_firstTab = _c.navButtons.first();
						}
						_firstTab.trigger('click');
						
						break;
						
					
				}
				
				
			}
			
			
			_init();
			
			return {
				controls: _c
			};
		
		
		
		});	
	};
	
	
})(jQuery);
