Class("Code", {
	has: {
		sqlfield: { is: "rw" }
	},
	methods: {
		get_dropdown: function() {
			$.get("/code/getdropdown/", function(data){
				var out;
				$.each(JSON.parse(data), function(key, val) {
					out = '<option value="'+val.id+'">'+val.title+'</option>';
			        $('#code_id').append(out);
			    });
			});			
		},
		get_sql_code: function(code_id) {
			var sqlfield = this.getSqlfield();
			$.ajax({
			   type: "GET",
			   url: "/code/getdata/",
			   data: "code_id=" + code_id,
			   success: function(msg){
					// this is taken from http://phpjs.org/functions/nl2br, please see the credits there
					var code_obj = new Code();
					var out = code_obj.syntax_highlight((JSON.parse(msg).code + '').replace(/([^>\r\n]?)(\r\n|\n\r|\r|\n)/g, '$1<br />$2'));
					sqlfield.html(out);
			   }
			});
		},
		syntax_highlight: function(code) {
			var fnd, f;
			var regex_keywords = /ON |DO |INSTEAD|EXTRACT|BEGIN|PARTITION |LIMIT |CAST |CONVERSION |DOMAIN |LARGE |OBJECT |OPERATOR |SEQUENCE |TYPE |AGGREGATE |COMMENT|LOGIN|NOCREATEDB|NOCREATEROLE|PASSWORD| ROLE|ADD|ALL|ALTER|AND|ANY|AS |ASC|AUTHORIZATION|BACKUP| BACKWARD |BEGIN |TIMESTAMP |CURRENT_TIMESTAMP |BETWEEN|BREAK|BROWSE|BULK|BY|BEFORE|EACH|ROW|PROCEDURE|EXECUTE|CASCADE|CASE|CHECK|CHECKPOINT|CLOSE|CLUSTERED|COALESCE|COLLATE|COLUMN|COMMIT|COMPUTE|CONSTRAINT|CONTAINS|CONTAINSTABLE|CONTINUE|CONVERT|CREATE |CROSS|INHERITS|CURRENT |CURRENT_DATE|CURRENT_TIME| CURRENT_TIMESTAMP|CURRENT_USER|CURSOR|DATABASE|DBCC|DEALLOCATE|DECLARE|DEFAULT|DELETE|DENY|DESC|DISK|DISTINCT|DISTRIBUTED|DOUBLE|DROP|DUMMY|DUMP|ELSE |ELSIF|END|ERRLVL|ESCAPE|EXCEPT|EXEC|EXECUTE|EXISTS|EXIT|FETCH| FILE |FILLFACTOR|FOR|FOREIGN|FREETEXT|FREETEXTTABLE|FROM|FULL|FUNCTION|GOTO|GRANT|GROUP|HAVING|HOLDLOCK|IDENTITY|IDENTITYCOL|IDENTITY_INSERT|IF| IN | INFO | INDEX|INNER|INSERT|INTERSECT|INTO|IS|JOIN|KEY|KILL| LAST | LEFT|LIKE| LOOP | LINENO|LOAD|NATIONAL|NEW|NOCHECK|NONCLUSTERED|NOT|NULL|NULLIF| MOVE | OF |OFF|OFFSETS|OFFSET | ON |OPEN|OPENDATASOURCE|OPENQUERY|OPENROWSET|OPENXML|OLD|OPTION|OR |ORDER|OUTER|OWNER|OVER|PERCENT|PLAN|PRECISION|PRIMARY|PRINT|PROC|PROCEDURE|PUBLIC| RAISE | RAISERROR|READ|READTEXT|RECONFIGURE|REFERENCES|RELATIVE|REPLICATION|REPLACE| RESTORE|RESTRICT| RETURN | RETURNS | REVOKE|RIGHT|ROLLBACK|ROWCOUNT|ROWGUIDCOL|RULE|SAVE|SCHEMA|SELECT|SESSION_USER|SET |SETUSER|SHUTDOWN|SOME|STATISTICS|SYSTEM_USER|TABLE|TEMPLATE|TEXTSIZE|THEN| TO | TOP |TRAN|TRANSACTION|TRIGGER|TRUNCATE|TSEQUAL|UNION|UNIQUE|UPDATE|UPDATETEXT|USE|USER|VALUES|VARYING|VIEW|WAITFOR|WHEN|WHERE|WHILE|WITH|WRITETEXT/g;
			var regex_data_type = /YEAR|DECIMAL|ABSTIME|BIGINT|BIT|BIT VARAYING|BOOLEAN|BYTEA| CHAR| CHARACTER|CHARACTER VARAYING| DATE|DOUBLE PRECISION|INTEGER|INTERVAL|MONEY|NUMERIC|OID|REAL|REFCURSOR|REGCONFIG|RELTIME|SMALLINT|SERIAL|TEXT|TIMESTAMP WITH TIME ZONE|TIMESTAMP WITHOUT TIME ZONE|TIME WITH TIME ZONE|TIME WITHOUT TIME ZONE|TSQUERY|TSVECTOR|VARCHAR/g;
			var regex_extra = /now()|nextval|currval|setval|SUBSTRING|CAST|rank()|avg|masklen|netmask|network|DictFile|Dictionary|AffFile|StopWords|TEXT|SEARCH|DICTIONARY|SYNONYMS|STOPWORDS|TEMPLATE|DICTFILE|AFFFILE|LANGUAGE| ispell| simple| snowball| synonym| thesaurus| asciiword| asciihword| hword_asciipart| hword| CONFIGURATION | MAPPING |trigger|plpgsql|tsvector_update_trigger|pg_catalog|german|ts_rewrite|to_tsquery|to_tsvector/g;
			var found = {"keywords" : code.match(regex_keywords), 
					 	 "data_type" : code.match(regex_data_type),
						 "extra" : code.match(regex_extra)};
				
			for(fnd in found) {
				for(f in found[fnd]) {
					code = code.replace(eval('/'+found[fnd][f]+'/g'), '<span class="'+fnd+'">'+found[fnd][f]+'</span>');
				}				
			}
			return code;
		},
		get_object_size: function(object) {
			Object.size = function(obj) {
			    var size = 0, key;
			    for (key in obj) {
			        if (obj.hasOwnProperty(key)) size++;
			    }
			    return size;
			};
			return Object.size(object);			
		}		
	}
});

