Merge branch 'js_pop_up'
This commit is contained in:
		
						commit
						a57dd62281
					
				|  | @ -5,4 +5,7 @@ | ||||||
| // the compiled file.
 | // the compiled file.
 | ||||||
| //
 | //
 | ||||||
| //= require jquery
 | //= require jquery
 | ||||||
| //= require jquery_ujs
 | //= require jquery_ujs
 | ||||||
|  | //= require jquery.form
 | ||||||
|  | //= require rss
 | ||||||
|  | //= require ajax_form
 | ||||||
|  | @ -0,0 +1,7 @@ | ||||||
|  | $('#submit_button').live('click', function(){ | ||||||
|  | 	$('#ajaxForm').ajaxSubmit({ | ||||||
|  | 		beforeSubmit: function(a,f,o) { | ||||||
|  | 			o.dataType = 'script'; | ||||||
|  | 		} | ||||||
|  | 	}); | ||||||
|  | }); | ||||||
|  | @ -0,0 +1,980 @@ | ||||||
|  | /*! | ||||||
|  |  * jQuery Form Plugin | ||||||
|  |  * version: 2.94 (13-DEC-2011) | ||||||
|  |  * @requires jQuery v1.3.2 or later | ||||||
|  |  * | ||||||
|  |  * Examples and documentation at: http://malsup.com/jquery/form/
 | ||||||
|  |  * Dual licensed under the MIT and GPL licenses: | ||||||
|  |  *	http://www.opensource.org/licenses/mit-license.php
 | ||||||
|  |  *	http://www.gnu.org/licenses/gpl.html
 | ||||||
|  |  */ | ||||||
|  | ;(function($) { | ||||||
|  | 
 | ||||||
|  | /* | ||||||
|  | 	Usage Note: | ||||||
|  | 	----------- | ||||||
|  | 	Do not use both ajaxSubmit and ajaxForm on the same form.  These | ||||||
|  | 	functions are intended to be exclusive.  Use ajaxSubmit if you want | ||||||
|  | 	to bind your own submit handler to the form.  For example, | ||||||
|  | 
 | ||||||
|  | 	$(document).ready(function() { | ||||||
|  | 		$('#myForm').bind('submit', function(e) { | ||||||
|  | 			e.preventDefault(); // <-- important
 | ||||||
|  | 			$(this).ajaxSubmit({ | ||||||
|  | 				target: '#output' | ||||||
|  | 			}); | ||||||
|  | 		}); | ||||||
|  | 	}); | ||||||
|  | 
 | ||||||
|  | 	Use ajaxForm when you want the plugin to manage all the event binding | ||||||
|  | 	for you.  For example, | ||||||
|  | 
 | ||||||
|  | 	$(document).ready(function() { | ||||||
|  | 		$('#myForm').ajaxForm({ | ||||||
|  | 			target: '#output' | ||||||
|  | 		}); | ||||||
|  | 	}); | ||||||
|  | 
 | ||||||
|  | 	When using ajaxForm, the ajaxSubmit function will be invoked for you | ||||||
|  | 	at the appropriate time. | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * ajaxSubmit() provides a mechanism for immediately submitting | ||||||
|  |  * an HTML form using AJAX. | ||||||
|  |  */ | ||||||
|  | $.fn.ajaxSubmit = function(options) { | ||||||
|  | 	// fast fail if nothing selected (http://dev.jquery.com/ticket/2752)
 | ||||||
|  | 	if (!this.length) { | ||||||
|  | 		log('ajaxSubmit: skipping submit process - no element selected'); | ||||||
|  | 		return this; | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	var method, action, url, $form = this; | ||||||
|  | 
 | ||||||
|  | 	if (typeof options == 'function') { | ||||||
|  | 		options = { success: options }; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	method = this.attr('method'); | ||||||
|  | 	action = this.attr('action'); | ||||||
|  | 	url = (typeof action === 'string') ? $.trim(action) : ''; | ||||||
|  | 	url = url || window.location.href || ''; | ||||||
|  | 	if (url) { | ||||||
|  | 		// clean url (don't include hash vaue)
 | ||||||
|  | 		url = (url.match(/^([^#]+)/)||[])[1]; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	options = $.extend(true, { | ||||||
|  | 		url:  url, | ||||||
|  | 		success: $.ajaxSettings.success, | ||||||
|  | 		type: method || 'GET', | ||||||
|  | 		iframeSrc: /^https/i.test(window.location.href || '') ? 'javascript:false' : 'about:blank' | ||||||
|  | 	}, options); | ||||||
|  | 
 | ||||||
|  | 	// hook for manipulating the form data before it is extracted;
 | ||||||
|  | 	// convenient for use with rich editors like tinyMCE or FCKEditor
 | ||||||
|  | 	var veto = {}; | ||||||
|  | 	this.trigger('form-pre-serialize', [this, options, veto]); | ||||||
|  | 	if (veto.veto) { | ||||||
|  | 		log('ajaxSubmit: submit vetoed via form-pre-serialize trigger'); | ||||||
|  | 		return this; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// provide opportunity to alter form data before it is serialized
 | ||||||
|  | 	if (options.beforeSerialize && options.beforeSerialize(this, options) === false) { | ||||||
|  | 		log('ajaxSubmit: submit aborted via beforeSerialize callback'); | ||||||
|  | 		return this; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	var traditional = options.traditional; | ||||||
|  | 	if ( traditional === undefined ) { | ||||||
|  | 		traditional = $.ajaxSettings.traditional; | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	var qx,n,v,a = this.formToArray(options.semantic); | ||||||
|  | 	if (options.data) { | ||||||
|  | 		options.extraData = options.data; | ||||||
|  | 		qx = $.param(options.data, traditional); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// give pre-submit callback an opportunity to abort the submit
 | ||||||
|  | 	if (options.beforeSubmit && options.beforeSubmit(a, this, options) === false) { | ||||||
|  | 		log('ajaxSubmit: submit aborted via beforeSubmit callback'); | ||||||
|  | 		return this; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// fire vetoable 'validate' event
 | ||||||
|  | 	this.trigger('form-submit-validate', [a, this, options, veto]); | ||||||
|  | 	if (veto.veto) { | ||||||
|  | 		log('ajaxSubmit: submit vetoed via form-submit-validate trigger'); | ||||||
|  | 		return this; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	var q = $.param(a, traditional); | ||||||
|  | 	if (qx) { | ||||||
|  | 		q = ( q ? (q + '&' + qx) : qx ); | ||||||
|  | 	}	 | ||||||
|  | 	if (options.type.toUpperCase() == 'GET') { | ||||||
|  | 		options.url += (options.url.indexOf('?') >= 0 ? '&' : '?') + q; | ||||||
|  | 		options.data = null;  // data is null for 'get'
 | ||||||
|  | 	} | ||||||
|  | 	else { | ||||||
|  | 		options.data = q; // data is the query string for 'post'
 | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	var callbacks = []; | ||||||
|  | 	if (options.resetForm) { | ||||||
|  | 		callbacks.push(function() { $form.resetForm(); }); | ||||||
|  | 	} | ||||||
|  | 	if (options.clearForm) { | ||||||
|  | 		callbacks.push(function() { $form.clearForm(options.includeHidden); }); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// perform a load on the target only if dataType is not provided
 | ||||||
|  | 	if (!options.dataType && options.target) { | ||||||
|  | 		var oldSuccess = options.success || function(){}; | ||||||
|  | 		callbacks.push(function(data) { | ||||||
|  | 			var fn = options.replaceTarget ? 'replaceWith' : 'html'; | ||||||
|  | 			$(options.target)[fn](data).each(oldSuccess, arguments); | ||||||
|  | 		}); | ||||||
|  | 	} | ||||||
|  | 	else if (options.success) { | ||||||
|  | 		callbacks.push(options.success); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	options.success = function(data, status, xhr) { // jQuery 1.4+ passes xhr as 3rd arg
 | ||||||
|  | 		var context = options.context || options;	// jQuery 1.4+ supports scope context 
 | ||||||
|  | 		for (var i=0, max=callbacks.length; i < max; i++) { | ||||||
|  | 			callbacks[i].apply(context, [data, status, xhr || $form, $form]); | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  | 
 | ||||||
|  | 	// are there files to upload?
 | ||||||
|  | 	var fileInputs = $('input:file:enabled[value]', this); // [value] (issue #113)
 | ||||||
|  | 	var hasFileInputs = fileInputs.length > 0; | ||||||
|  | 	var mp = 'multipart/form-data'; | ||||||
|  | 	var multipart = ($form.attr('enctype') == mp || $form.attr('encoding') == mp); | ||||||
|  | 
 | ||||||
|  | 	var fileAPI = !!(hasFileInputs && fileInputs.get(0).files && window.FormData); | ||||||
|  | 	log("fileAPI :" + fileAPI); | ||||||
|  | 	var shouldUseFrame = (hasFileInputs || multipart) && !fileAPI; | ||||||
|  | 
 | ||||||
|  | 	// options.iframe allows user to force iframe mode
 | ||||||
|  | 	// 06-NOV-09: now defaulting to iframe mode if file input is detected
 | ||||||
|  | 	if (options.iframe !== false && (options.iframe || shouldUseFrame)) { | ||||||
|  | 		// hack to fix Safari hang (thanks to Tim Molendijk for this)
 | ||||||
|  | 		// see:  http://groups.google.com/group/jquery-dev/browse_thread/thread/36395b7ab510dd5d
 | ||||||
|  | 		if (options.closeKeepAlive) { | ||||||
|  | 			$.get(options.closeKeepAlive, function() { | ||||||
|  | 				fileUploadIframe(a); | ||||||
|  | 			}); | ||||||
|  | 		} | ||||||
|  |   		else { | ||||||
|  | 			fileUploadIframe(a); | ||||||
|  |   		} | ||||||
|  | 	} | ||||||
|  | 	else if ((hasFileInputs || multipart) && fileAPI) { | ||||||
|  | 		options.progress = options.progress || $.noop; | ||||||
|  | 		fileUploadXhr(a); | ||||||
|  | 	} | ||||||
|  | 	else { | ||||||
|  | 		$.ajax(options); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	 // fire 'notify' event
 | ||||||
|  | 	 this.trigger('form-submit-notify', [this, options]); | ||||||
|  | 	 return this; | ||||||
|  | 
 | ||||||
|  | 	 // XMLHttpRequest Level 2 file uploads (big hat tip to francois2metz)
 | ||||||
|  | 	function fileUploadXhr(a) { | ||||||
|  | 		var formdata = new FormData(); | ||||||
|  | 
 | ||||||
|  | 		for (var i=0; i < a.length; i++) { | ||||||
|  | 			if (a[i].type == 'file') | ||||||
|  | 				continue; | ||||||
|  | 			formdata.append(a[i].name, a[i].value); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		$form.find('input:file:enabled').each(function(){ | ||||||
|  | 			var name = $(this).attr('name'), files = this.files; | ||||||
|  | 			if (name) { | ||||||
|  | 				for (var i=0; i < files.length; i++) | ||||||
|  | 					formdata.append(name, files[i]); | ||||||
|  | 			} | ||||||
|  | 		}); | ||||||
|  | 
 | ||||||
|  | 		if (options.extraData) { | ||||||
|  | 			for (var k in options.extraData) | ||||||
|  | 				formdata.append(k, options.extraData[k]) | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		options.data = null; | ||||||
|  | 
 | ||||||
|  | 		var s = $.extend(true, {}, $.ajaxSettings, options, { | ||||||
|  | 			contentType: false, | ||||||
|  | 			processData: false, | ||||||
|  | 			cache: false, | ||||||
|  | 			type: 'POST' | ||||||
|  | 		}); | ||||||
|  | 
 | ||||||
|  |       s.context = s.context || s; | ||||||
|  | 
 | ||||||
|  |       s.data = null; | ||||||
|  |       var beforeSend = s.beforeSend; | ||||||
|  |       s.beforeSend = function(xhr, o) { | ||||||
|  |           o.data = formdata; | ||||||
|  |           if(xhr.upload) { // unfortunately, jQuery doesn't expose this prop (http://bugs.jquery.com/ticket/10190)
 | ||||||
|  |               xhr.upload.onprogress = function(event) { | ||||||
|  |                   o.progress(event.position, event.total); | ||||||
|  |               }; | ||||||
|  |           } | ||||||
|  |           if(beforeSend) | ||||||
|  |               beforeSend.call(o, xhr, options); | ||||||
|  |       }; | ||||||
|  |       $.ajax(s); | ||||||
|  |    } | ||||||
|  | 
 | ||||||
|  | 	// private function for handling file uploads (hat tip to YAHOO!)
 | ||||||
|  | 	function fileUploadIframe(a) { | ||||||
|  | 		var form = $form[0], el, i, s, g, id, $io, io, xhr, sub, n, timedOut, timeoutHandle; | ||||||
|  | 		var useProp = !!$.fn.prop; | ||||||
|  | 
 | ||||||
|  | 		if (a) { | ||||||
|  | 			if ( useProp ) { | ||||||
|  | 				// ensure that every serialized input is still enabled
 | ||||||
|  | 				for (i=0; i < a.length; i++) { | ||||||
|  | 					el = $(form[a[i].name]); | ||||||
|  | 					el.prop('disabled', false); | ||||||
|  | 				} | ||||||
|  | 			} else { | ||||||
|  | 				for (i=0; i < a.length; i++) { | ||||||
|  | 					el = $(form[a[i].name]); | ||||||
|  | 					el.removeAttr('disabled'); | ||||||
|  | 				} | ||||||
|  | 			}; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		if ($(':input[name=submit],:input[id=submit]', form).length) { | ||||||
|  | 			// if there is an input with a name or id of 'submit' then we won't be
 | ||||||
|  | 			// able to invoke the submit fn on the form (at least not x-browser)
 | ||||||
|  | 			alert('Error: Form elements must not have name or id of "submit".'); | ||||||
|  | 			return; | ||||||
|  | 		} | ||||||
|  | 		 | ||||||
|  | 		s = $.extend(true, {}, $.ajaxSettings, options); | ||||||
|  | 		s.context = s.context || s; | ||||||
|  | 		id = 'jqFormIO' + (new Date().getTime()); | ||||||
|  | 		if (s.iframeTarget) { | ||||||
|  | 			$io = $(s.iframeTarget); | ||||||
|  | 			n = $io.attr('name'); | ||||||
|  | 			if (n == null) | ||||||
|  | 			 	$io.attr('name', id); | ||||||
|  | 			else | ||||||
|  | 				id = n; | ||||||
|  | 		} | ||||||
|  | 		else { | ||||||
|  | 			$io = $('<iframe name="' + id + '" src="'+ s.iframeSrc +'" />'); | ||||||
|  | 			$io.css({ position: 'absolute', top: '-1000px', left: '-1000px' }); | ||||||
|  | 		} | ||||||
|  | 		io = $io[0]; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 		xhr = { // mock object
 | ||||||
|  | 			aborted: 0, | ||||||
|  | 			responseText: null, | ||||||
|  | 			responseXML: null, | ||||||
|  | 			status: 0, | ||||||
|  | 			statusText: 'n/a', | ||||||
|  | 			getAllResponseHeaders: function() {}, | ||||||
|  | 			getResponseHeader: function() {}, | ||||||
|  | 			setRequestHeader: function() {}, | ||||||
|  | 			abort: function(status) { | ||||||
|  | 				var e = (status === 'timeout' ? 'timeout' : 'aborted'); | ||||||
|  | 				log('aborting upload... ' + e); | ||||||
|  | 				this.aborted = 1; | ||||||
|  | 				$io.attr('src', s.iframeSrc); // abort op in progress
 | ||||||
|  | 				xhr.error = e; | ||||||
|  | 				s.error && s.error.call(s.context, xhr, e, status); | ||||||
|  | 				g && $.event.trigger("ajaxError", [xhr, s, e]); | ||||||
|  | 				s.complete && s.complete.call(s.context, xhr, e); | ||||||
|  | 			} | ||||||
|  | 		}; | ||||||
|  | 
 | ||||||
|  | 		g = s.global; | ||||||
|  | 		// trigger ajax global events so that activity/block indicators work like normal
 | ||||||
|  | 		if (g && ! $.active++) { | ||||||
|  | 			$.event.trigger("ajaxStart"); | ||||||
|  | 		} | ||||||
|  | 		if (g) { | ||||||
|  | 			$.event.trigger("ajaxSend", [xhr, s]); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		if (s.beforeSend && s.beforeSend.call(s.context, xhr, s) === false) { | ||||||
|  | 			if (s.global) { | ||||||
|  | 				$.active--; | ||||||
|  | 			} | ||||||
|  | 			return; | ||||||
|  | 		} | ||||||
|  | 		if (xhr.aborted) { | ||||||
|  | 			return; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		// add submitting element to data if we know it
 | ||||||
|  | 		sub = form.clk; | ||||||
|  | 		if (sub) { | ||||||
|  | 			n = sub.name; | ||||||
|  | 			if (n && !sub.disabled) { | ||||||
|  | 				s.extraData = s.extraData || {}; | ||||||
|  | 				s.extraData[n] = sub.value; | ||||||
|  | 				if (sub.type == "image") { | ||||||
|  | 					s.extraData[n+'.x'] = form.clk_x; | ||||||
|  | 					s.extraData[n+'.y'] = form.clk_y; | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		 | ||||||
|  | 		var CLIENT_TIMEOUT_ABORT = 1; | ||||||
|  | 		var SERVER_ABORT = 2; | ||||||
|  | 
 | ||||||
|  | 		function getDoc(frame) { | ||||||
|  | 			var doc = frame.contentWindow ? frame.contentWindow.document : frame.contentDocument ? frame.contentDocument : frame.document; | ||||||
|  | 			return doc; | ||||||
|  | 		} | ||||||
|  | 		 | ||||||
|  | 		// Rails CSRF hack (thanks to Yvan Barthelemy)
 | ||||||
|  | 		var csrf_token = $('meta[name=csrf-token]').attr('content'); | ||||||
|  | 		var csrf_param = $('meta[name=csrf-param]').attr('content'); | ||||||
|  | 		if (csrf_param && csrf_token) { | ||||||
|  | 			s.extraData = s.extraData || {}; | ||||||
|  | 			s.extraData[csrf_param] = csrf_token; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		// take a breath so that pending repaints get some cpu time before the upload starts
 | ||||||
|  | 		function doSubmit() { | ||||||
|  | 			// make sure form attrs are set
 | ||||||
|  | 			var t = $form.attr('target'), a = $form.attr('action'); | ||||||
|  | 
 | ||||||
|  | 			// update form attrs in IE friendly way
 | ||||||
|  | 			form.setAttribute('target',id); | ||||||
|  | 			if (!method) { | ||||||
|  | 				form.setAttribute('method', 'POST'); | ||||||
|  | 			} | ||||||
|  | 			if (a != s.url) { | ||||||
|  | 				form.setAttribute('action', s.url); | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			// ie borks in some cases when setting encoding
 | ||||||
|  | 			if (! s.skipEncodingOverride && (!method || /post/i.test(method))) { | ||||||
|  | 				$form.attr({ | ||||||
|  | 					encoding: 'multipart/form-data', | ||||||
|  | 					enctype:  'multipart/form-data' | ||||||
|  | 				}); | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			// support timout
 | ||||||
|  | 			if (s.timeout) { | ||||||
|  | 				timeoutHandle = setTimeout(function() { timedOut = true; cb(CLIENT_TIMEOUT_ABORT); }, s.timeout); | ||||||
|  | 			} | ||||||
|  | 			 | ||||||
|  | 			// look for server aborts
 | ||||||
|  | 			function checkState() { | ||||||
|  | 				try { | ||||||
|  | 					var state = getDoc(io).readyState; | ||||||
|  | 					log('state = ' + state); | ||||||
|  | 					if (state.toLowerCase() == 'uninitialized') | ||||||
|  | 						setTimeout(checkState,50); | ||||||
|  | 				} | ||||||
|  | 				catch(e) { | ||||||
|  | 					log('Server abort: ' , e, ' (', e.name, ')'); | ||||||
|  | 					cb(SERVER_ABORT); | ||||||
|  | 					timeoutHandle && clearTimeout(timeoutHandle); | ||||||
|  | 					timeoutHandle = undefined; | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			// add "extra" data to form if provided in options
 | ||||||
|  | 			var extraInputs = []; | ||||||
|  | 			try { | ||||||
|  | 				if (s.extraData) { | ||||||
|  | 					for (var n in s.extraData) { | ||||||
|  | 						extraInputs.push( | ||||||
|  | 							$('<input type="hidden" name="'+n+'">').attr('value',s.extraData[n]) | ||||||
|  | 								.appendTo(form)[0]); | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 
 | ||||||
|  | 				if (!s.iframeTarget) { | ||||||
|  | 					// add iframe to doc and submit the form
 | ||||||
|  | 					$io.appendTo('body'); | ||||||
|  | 					io.attachEvent ? io.attachEvent('onload', cb) : io.addEventListener('load', cb, false); | ||||||
|  | 				} | ||||||
|  | 				setTimeout(checkState,15); | ||||||
|  | 				form.submit(); | ||||||
|  | 			} | ||||||
|  | 			finally { | ||||||
|  | 				// reset attrs and remove "extra" input elements
 | ||||||
|  | 				form.setAttribute('action',a); | ||||||
|  | 				if(t) { | ||||||
|  | 					form.setAttribute('target', t); | ||||||
|  | 				} else { | ||||||
|  | 					$form.removeAttr('target'); | ||||||
|  | 				} | ||||||
|  | 				$(extraInputs).remove(); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		if (s.forceSync) { | ||||||
|  | 			doSubmit(); | ||||||
|  | 		} | ||||||
|  | 		else { | ||||||
|  | 			setTimeout(doSubmit, 10); // this lets dom updates render
 | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		var data, doc, domCheckCount = 50, callbackProcessed; | ||||||
|  | 
 | ||||||
|  | 		function cb(e) { | ||||||
|  | 			if (xhr.aborted || callbackProcessed) { | ||||||
|  | 				return; | ||||||
|  | 			} | ||||||
|  | 			try { | ||||||
|  | 				doc = getDoc(io); | ||||||
|  | 			} | ||||||
|  | 			catch(ex) { | ||||||
|  | 				log('cannot access response document: ', ex); | ||||||
|  | 				e = SERVER_ABORT; | ||||||
|  | 			} | ||||||
|  | 			if (e === CLIENT_TIMEOUT_ABORT && xhr) { | ||||||
|  | 				xhr.abort('timeout'); | ||||||
|  | 				return; | ||||||
|  | 			} | ||||||
|  | 			else if (e == SERVER_ABORT && xhr) { | ||||||
|  | 				xhr.abort('server abort'); | ||||||
|  | 				return; | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			if (!doc || doc.location.href == s.iframeSrc) { | ||||||
|  | 				// response not received yet
 | ||||||
|  | 				if (!timedOut) | ||||||
|  | 					return; | ||||||
|  | 			} | ||||||
|  | 			io.detachEvent ? io.detachEvent('onload', cb) : io.removeEventListener('load', cb, false); | ||||||
|  | 
 | ||||||
|  | 			var status = 'success', errMsg; | ||||||
|  | 			try { | ||||||
|  | 				if (timedOut) { | ||||||
|  | 					throw 'timeout'; | ||||||
|  | 				} | ||||||
|  | 
 | ||||||
|  | 				var isXml = s.dataType == 'xml' || doc.XMLDocument || $.isXMLDoc(doc); | ||||||
|  | 				log('isXml='+isXml); | ||||||
|  | 				if (!isXml && window.opera && (doc.body == null || doc.body.innerHTML == '')) { | ||||||
|  | 					if (--domCheckCount) { | ||||||
|  | 						// in some browsers (Opera) the iframe DOM is not always traversable when
 | ||||||
|  | 						// the onload callback fires, so we loop a bit to accommodate
 | ||||||
|  | 						log('requeing onLoad callback, DOM not available'); | ||||||
|  | 						setTimeout(cb, 250); | ||||||
|  | 						return; | ||||||
|  | 					} | ||||||
|  | 					// let this fall through because server response could be an empty document
 | ||||||
|  | 					//log('Could not access iframe DOM after mutiple tries.');
 | ||||||
|  | 					//throw 'DOMException: not available';
 | ||||||
|  | 				} | ||||||
|  | 
 | ||||||
|  | 				//log('response detected');
 | ||||||
|  | 				var docRoot = doc.body ? doc.body : doc.documentElement; | ||||||
|  | 				xhr.responseText = docRoot ? docRoot.innerHTML : null; | ||||||
|  | 				xhr.responseXML = doc.XMLDocument ? doc.XMLDocument : doc; | ||||||
|  | 				if (isXml) | ||||||
|  | 					s.dataType = 'xml'; | ||||||
|  | 				xhr.getResponseHeader = function(header){ | ||||||
|  | 					var headers = {'content-type': s.dataType}; | ||||||
|  | 					return headers[header]; | ||||||
|  | 				}; | ||||||
|  | 				// support for XHR 'status' & 'statusText' emulation :
 | ||||||
|  | 				if (docRoot) { | ||||||
|  | 					xhr.status = Number( docRoot.getAttribute('status') ) || xhr.status; | ||||||
|  | 					xhr.statusText = docRoot.getAttribute('statusText') || xhr.statusText; | ||||||
|  | 				} | ||||||
|  | 
 | ||||||
|  | 				var dt = (s.dataType || '').toLowerCase(); | ||||||
|  | 				var scr = /(json|script|text)/.test(dt); | ||||||
|  | 				if (scr || s.textarea) { | ||||||
|  | 					// see if user embedded response in textarea
 | ||||||
|  | 					var ta = doc.getElementsByTagName('textarea')[0]; | ||||||
|  | 					if (ta) { | ||||||
|  | 						xhr.responseText = ta.value; | ||||||
|  | 						// support for XHR 'status' & 'statusText' emulation :
 | ||||||
|  | 						xhr.status = Number( ta.getAttribute('status') ) || xhr.status; | ||||||
|  | 						xhr.statusText = ta.getAttribute('statusText') || xhr.statusText; | ||||||
|  | 					} | ||||||
|  | 					else if (scr) { | ||||||
|  | 						// account for browsers injecting pre around json response
 | ||||||
|  | 						var pre = doc.getElementsByTagName('pre')[0]; | ||||||
|  | 						var b = doc.getElementsByTagName('body')[0]; | ||||||
|  | 						if (pre) { | ||||||
|  | 							xhr.responseText = pre.textContent ? pre.textContent : pre.innerText; | ||||||
|  | 						} | ||||||
|  | 						else if (b) { | ||||||
|  | 							xhr.responseText = b.textContent ? b.textContent : b.innerText; | ||||||
|  | 						} | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 				else if (dt == 'xml' && !xhr.responseXML && xhr.responseText != null) { | ||||||
|  | 					xhr.responseXML = toXml(xhr.responseText); | ||||||
|  | 				} | ||||||
|  | 
 | ||||||
|  | 				try { | ||||||
|  | 					data = httpData(xhr, dt, s); | ||||||
|  | 				} | ||||||
|  | 				catch (e) { | ||||||
|  | 					status = 'parsererror'; | ||||||
|  | 					xhr.error = errMsg = (e || status); | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 			catch (e) { | ||||||
|  | 				log('error caught: ',e); | ||||||
|  | 				status = 'error'; | ||||||
|  | 				xhr.error = errMsg = (e || status); | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			if (xhr.aborted) { | ||||||
|  | 				log('upload aborted'); | ||||||
|  | 				status = null; | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			if (xhr.status) { // we've set xhr.status
 | ||||||
|  | 				status = (xhr.status >= 200 && xhr.status < 300 || xhr.status === 304) ? 'success' : 'error'; | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			// ordering of these callbacks/triggers is odd, but that's how $.ajax does it
 | ||||||
|  | 			if (status === 'success') { | ||||||
|  | 				s.success && s.success.call(s.context, data, 'success', xhr); | ||||||
|  | 				g && $.event.trigger("ajaxSuccess", [xhr, s]); | ||||||
|  | 			} | ||||||
|  | 			else if (status) { | ||||||
|  | 				if (errMsg == undefined) | ||||||
|  | 					errMsg = xhr.statusText; | ||||||
|  | 				s.error && s.error.call(s.context, xhr, status, errMsg); | ||||||
|  | 				g && $.event.trigger("ajaxError", [xhr, s, errMsg]); | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			g && $.event.trigger("ajaxComplete", [xhr, s]); | ||||||
|  | 
 | ||||||
|  | 			if (g && ! --$.active) { | ||||||
|  | 				$.event.trigger("ajaxStop"); | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			s.complete && s.complete.call(s.context, xhr, status); | ||||||
|  | 
 | ||||||
|  | 			callbackProcessed = true; | ||||||
|  | 			if (s.timeout) | ||||||
|  | 				clearTimeout(timeoutHandle); | ||||||
|  | 
 | ||||||
|  | 			// clean up
 | ||||||
|  | 			setTimeout(function() { | ||||||
|  | 				if (!s.iframeTarget) | ||||||
|  | 					$io.remove(); | ||||||
|  | 				xhr.responseXML = null; | ||||||
|  | 			}, 100); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		var toXml = $.parseXML || function(s, doc) { // use parseXML if available (jQuery 1.5+)
 | ||||||
|  | 			if (window.ActiveXObject) { | ||||||
|  | 				doc = new ActiveXObject('Microsoft.XMLDOM'); | ||||||
|  | 				doc.async = 'false'; | ||||||
|  | 				doc.loadXML(s); | ||||||
|  | 			} | ||||||
|  | 			else { | ||||||
|  | 				doc = (new DOMParser()).parseFromString(s, 'text/xml'); | ||||||
|  | 			} | ||||||
|  | 			return (doc && doc.documentElement && doc.documentElement.nodeName != 'parsererror') ? doc : null; | ||||||
|  | 		}; | ||||||
|  | 		var parseJSON = $.parseJSON || function(s) { | ||||||
|  | 			return window['eval']('(' + s + ')'); | ||||||
|  | 		}; | ||||||
|  | 
 | ||||||
|  | 		var httpData = function( xhr, type, s ) { // mostly lifted from jq1.4.4
 | ||||||
|  | 
 | ||||||
|  | 			var ct = xhr.getResponseHeader('content-type') || '', | ||||||
|  | 				xml = type === 'xml' || !type && ct.indexOf('xml') >= 0, | ||||||
|  | 				data = xml ? xhr.responseXML : xhr.responseText; | ||||||
|  | 
 | ||||||
|  | 			if (xml && data.documentElement.nodeName === 'parsererror') { | ||||||
|  | 				$.error && $.error('parsererror'); | ||||||
|  | 			} | ||||||
|  | 			if (s && s.dataFilter) { | ||||||
|  | 				data = s.dataFilter(data, type); | ||||||
|  | 			} | ||||||
|  | 			if (typeof data === 'string') { | ||||||
|  | 				if (type === 'json' || !type && ct.indexOf('json') >= 0) { | ||||||
|  | 					data = parseJSON(data); | ||||||
|  | 				} else if (type === "script" || !type && ct.indexOf("javascript") >= 0) { | ||||||
|  | 					$.globalEval(data); | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 			return data; | ||||||
|  | 		}; | ||||||
|  | 	} | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * ajaxForm() provides a mechanism for fully automating form submission. | ||||||
|  |  * | ||||||
|  |  * The advantages of using this method instead of ajaxSubmit() are: | ||||||
|  |  * | ||||||
|  |  * 1: This method will include coordinates for <input type="image" /> elements (if the element | ||||||
|  |  *	is used to submit the form). | ||||||
|  |  * 2. This method will include the submit element's name/value data (for the element that was | ||||||
|  |  *	used to submit the form). | ||||||
|  |  * 3. This method binds the submit() method to the form for you. | ||||||
|  |  * | ||||||
|  |  * The options argument for ajaxForm works exactly as it does for ajaxSubmit.  ajaxForm merely | ||||||
|  |  * passes the options argument along after properly binding events for submit elements and | ||||||
|  |  * the form itself. | ||||||
|  |  */ | ||||||
|  | $.fn.ajaxForm = function(options) { | ||||||
|  | 	// in jQuery 1.3+ we can fix mistakes with the ready state
 | ||||||
|  | 	if (this.length === 0) { | ||||||
|  | 		var o = { s: this.selector, c: this.context }; | ||||||
|  | 		if (!$.isReady && o.s) { | ||||||
|  | 			log('DOM not ready, queuing ajaxForm'); | ||||||
|  | 			$(function() { | ||||||
|  | 				$(o.s,o.c).ajaxForm(options); | ||||||
|  | 			}); | ||||||
|  | 			return this; | ||||||
|  | 		} | ||||||
|  | 		// is your DOM ready?  http://docs.jquery.com/Tutorials:Introducing_$(document).ready()
 | ||||||
|  | 		log('terminating; zero elements found by selector' + ($.isReady ? '' : ' (DOM not ready)')); | ||||||
|  | 		return this; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return this.ajaxFormUnbind().bind('submit.form-plugin', function(e) { | ||||||
|  | 		if (!e.isDefaultPrevented()) { // if event has been canceled, don't proceed
 | ||||||
|  | 			e.preventDefault(); | ||||||
|  | 			$(this).ajaxSubmit(options); | ||||||
|  | 		} | ||||||
|  | 	}).bind('click.form-plugin', function(e) { | ||||||
|  | 		var target = e.target; | ||||||
|  | 		var $el = $(target); | ||||||
|  | 		if (!($el.is(":submit,input:image"))) { | ||||||
|  | 			// is this a child element of the submit el?  (ex: a span within a button)
 | ||||||
|  | 			var t = $el.closest(':submit'); | ||||||
|  | 			if (t.length == 0) { | ||||||
|  | 				return; | ||||||
|  | 			} | ||||||
|  | 			target = t[0]; | ||||||
|  | 		} | ||||||
|  | 		var form = this; | ||||||
|  | 		form.clk = target; | ||||||
|  | 		if (target.type == 'image') { | ||||||
|  | 			if (e.offsetX != undefined) { | ||||||
|  | 				form.clk_x = e.offsetX; | ||||||
|  | 				form.clk_y = e.offsetY; | ||||||
|  | 			} else if (typeof $.fn.offset == 'function') { // try to use dimensions plugin
 | ||||||
|  | 				var offset = $el.offset(); | ||||||
|  | 				form.clk_x = e.pageX - offset.left; | ||||||
|  | 				form.clk_y = e.pageY - offset.top; | ||||||
|  | 			} else { | ||||||
|  | 				form.clk_x = e.pageX - target.offsetLeft; | ||||||
|  | 				form.clk_y = e.pageY - target.offsetTop; | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		// clear form vars
 | ||||||
|  | 		setTimeout(function() { form.clk = form.clk_x = form.clk_y = null; }, 100); | ||||||
|  | 	}); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | // ajaxFormUnbind unbinds the event handlers that were bound by ajaxForm
 | ||||||
|  | $.fn.ajaxFormUnbind = function() { | ||||||
|  | 	return this.unbind('submit.form-plugin click.form-plugin'); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * formToArray() gathers form element data into an array of objects that can | ||||||
|  |  * be passed to any of the following ajax functions: $.get, $.post, or load. | ||||||
|  |  * Each object in the array has both a 'name' and 'value' property.  An example of | ||||||
|  |  * an array for a simple login form might be: | ||||||
|  |  * | ||||||
|  |  * [ { name: 'username', value: 'jresig' }, { name: 'password', value: 'secret' } ] | ||||||
|  |  * | ||||||
|  |  * It is this array that is passed to pre-submit callback functions provided to the | ||||||
|  |  * ajaxSubmit() and ajaxForm() methods. | ||||||
|  |  */ | ||||||
|  | $.fn.formToArray = function(semantic) { | ||||||
|  | 	var a = []; | ||||||
|  | 	if (this.length === 0) { | ||||||
|  | 		return a; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	var form = this[0]; | ||||||
|  | 	var els = semantic ? form.getElementsByTagName('*') : form.elements; | ||||||
|  | 	if (!els) { | ||||||
|  | 		return a; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	var i,j,n,v,el,max,jmax; | ||||||
|  | 	for(i=0, max=els.length; i < max; i++) { | ||||||
|  | 		el = els[i]; | ||||||
|  | 		n = el.name; | ||||||
|  | 		if (!n) { | ||||||
|  | 			continue; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		if (semantic && form.clk && el.type == "image") { | ||||||
|  | 			// handle image inputs on the fly when semantic == true
 | ||||||
|  | 			if(!el.disabled && form.clk == el) { | ||||||
|  | 				a.push({name: n, value: $(el).val(), type: el.type }); | ||||||
|  | 				a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y}); | ||||||
|  | 			} | ||||||
|  | 			continue; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		v = $.fieldValue(el, true); | ||||||
|  | 		if (v && v.constructor == Array) { | ||||||
|  | 			for(j=0, jmax=v.length; j < jmax; j++) { | ||||||
|  | 				a.push({name: n, value: v[j]}); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		else if (v !== null && typeof v != 'undefined') { | ||||||
|  | 			a.push({name: n, value: v, type: el.type}); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if (!semantic && form.clk) { | ||||||
|  | 		// input type=='image' are not found in elements array! handle it here
 | ||||||
|  | 		var $input = $(form.clk), input = $input[0]; | ||||||
|  | 		n = input.name; | ||||||
|  | 		if (n && !input.disabled && input.type == 'image') { | ||||||
|  | 			a.push({name: n, value: $input.val()}); | ||||||
|  | 			a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y}); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return a; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * Serializes form data into a 'submittable' string. This method will return a string | ||||||
|  |  * in the format: name1=value1&name2=value2 | ||||||
|  |  */ | ||||||
|  | $.fn.formSerialize = function(semantic) { | ||||||
|  | 	//hand off to jQuery.param for proper encoding
 | ||||||
|  | 	return $.param(this.formToArray(semantic)); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * Serializes all field elements in the jQuery object into a query string. | ||||||
|  |  * This method will return a string in the format: name1=value1&name2=value2 | ||||||
|  |  */ | ||||||
|  | $.fn.fieldSerialize = function(successful) { | ||||||
|  | 	var a = []; | ||||||
|  | 	this.each(function() { | ||||||
|  | 		var n = this.name; | ||||||
|  | 		if (!n) { | ||||||
|  | 			return; | ||||||
|  | 		} | ||||||
|  | 		var v = $.fieldValue(this, successful); | ||||||
|  | 		if (v && v.constructor == Array) { | ||||||
|  | 			for (var i=0,max=v.length; i < max; i++) { | ||||||
|  | 				a.push({name: n, value: v[i]}); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		else if (v !== null && typeof v != 'undefined') { | ||||||
|  | 			a.push({name: this.name, value: v}); | ||||||
|  | 		} | ||||||
|  | 	}); | ||||||
|  | 	//hand off to jQuery.param for proper encoding
 | ||||||
|  | 	return $.param(a); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * Returns the value(s) of the element in the matched set.  For example, consider the following form: | ||||||
|  |  * | ||||||
|  |  *  <form><fieldset> | ||||||
|  |  *	  <input name="A" type="text" /> | ||||||
|  |  *	  <input name="A" type="text" /> | ||||||
|  |  *	  <input name="B" type="checkbox" value="B1" /> | ||||||
|  |  *	  <input name="B" type="checkbox" value="B2"/> | ||||||
|  |  *	  <input name="C" type="radio" value="C1" /> | ||||||
|  |  *	  <input name="C" type="radio" value="C2" /> | ||||||
|  |  *  </fieldset></form> | ||||||
|  |  * | ||||||
|  |  *  var v = $(':text').fieldValue(); | ||||||
|  |  *  // if no values are entered into the text inputs
 | ||||||
|  |  *  v == ['',''] | ||||||
|  |  *  // if values entered into the text inputs are 'foo' and 'bar'
 | ||||||
|  |  *  v == ['foo','bar'] | ||||||
|  |  * | ||||||
|  |  *  var v = $(':checkbox').fieldValue(); | ||||||
|  |  *  // if neither checkbox is checked
 | ||||||
|  |  *  v === undefined | ||||||
|  |  *  // if both checkboxes are checked
 | ||||||
|  |  *  v == ['B1', 'B2'] | ||||||
|  |  * | ||||||
|  |  *  var v = $(':radio').fieldValue(); | ||||||
|  |  *  // if neither radio is checked
 | ||||||
|  |  *  v === undefined | ||||||
|  |  *  // if first radio is checked
 | ||||||
|  |  *  v == ['C1'] | ||||||
|  |  * | ||||||
|  |  * The successful argument controls whether or not the field element must be 'successful' | ||||||
|  |  * (per http://www.w3.org/TR/html4/interact/forms.html#successful-controls).
 | ||||||
|  |  * The default value of the successful argument is true.  If this value is false the value(s) | ||||||
|  |  * for each element is returned. | ||||||
|  |  * | ||||||
|  |  * Note: This method *always* returns an array.  If no valid value can be determined the | ||||||
|  |  *	array will be empty, otherwise it will contain one or more values. | ||||||
|  |  */ | ||||||
|  | $.fn.fieldValue = function(successful) { | ||||||
|  | 	for (var val=[], i=0, max=this.length; i < max; i++) { | ||||||
|  | 		var el = this[i]; | ||||||
|  | 		var v = $.fieldValue(el, successful); | ||||||
|  | 		if (v === null || typeof v == 'undefined' || (v.constructor == Array && !v.length)) { | ||||||
|  | 			continue; | ||||||
|  | 		} | ||||||
|  | 		v.constructor == Array ? $.merge(val, v) : val.push(v); | ||||||
|  | 	} | ||||||
|  | 	return val; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * Returns the value of the field element. | ||||||
|  |  */ | ||||||
|  | $.fieldValue = function(el, successful) { | ||||||
|  | 	var n = el.name, t = el.type, tag = el.tagName.toLowerCase(); | ||||||
|  | 	if (successful === undefined) { | ||||||
|  | 		successful = true; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if (successful && (!n || el.disabled || t == 'reset' || t == 'button' || | ||||||
|  | 		(t == 'checkbox' || t == 'radio') && !el.checked || | ||||||
|  | 		(t == 'submit' || t == 'image') && el.form && el.form.clk != el || | ||||||
|  | 		tag == 'select' && el.selectedIndex == -1)) { | ||||||
|  | 			return null; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if (tag == 'select') { | ||||||
|  | 		var index = el.selectedIndex; | ||||||
|  | 		if (index < 0) { | ||||||
|  | 			return null; | ||||||
|  | 		} | ||||||
|  | 		var a = [], ops = el.options; | ||||||
|  | 		var one = (t == 'select-one'); | ||||||
|  | 		var max = (one ? index+1 : ops.length); | ||||||
|  | 		for(var i=(one ? index : 0); i < max; i++) { | ||||||
|  | 			var op = ops[i]; | ||||||
|  | 			if (op.selected) { | ||||||
|  | 				var v = op.value; | ||||||
|  | 				if (!v) { // extra pain for IE...
 | ||||||
|  | 					v = (op.attributes && op.attributes['value'] && !(op.attributes['value'].specified)) ? op.text : op.value; | ||||||
|  | 				} | ||||||
|  | 				if (one) { | ||||||
|  | 					return v; | ||||||
|  | 				} | ||||||
|  | 				a.push(v); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		return a; | ||||||
|  | 	} | ||||||
|  | 	return $(el).val(); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * Clears the form data.  Takes the following actions on the form's input fields: | ||||||
|  |  *  - input text fields will have their 'value' property set to the empty string | ||||||
|  |  *  - select elements will have their 'selectedIndex' property set to -1 | ||||||
|  |  *  - checkbox and radio inputs will have their 'checked' property set to false | ||||||
|  |  *  - inputs of type submit, button, reset, and hidden will *not* be effected | ||||||
|  |  *  - button elements will *not* be effected | ||||||
|  |  */ | ||||||
|  | $.fn.clearForm = function(includeHidden) { | ||||||
|  | 	return this.each(function() { | ||||||
|  | 		$('input,select,textarea', this).clearFields(includeHidden); | ||||||
|  | 	}); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * Clears the selected form elements. | ||||||
|  |  */ | ||||||
|  | $.fn.clearFields = $.fn.clearInputs = function(includeHidden) { | ||||||
|  | 	var re = /^(?:color|date|datetime|email|month|number|password|range|search|tel|text|time|url|week)$/i; // 'hidden' is not in this list
 | ||||||
|  | 	return this.each(function() { | ||||||
|  | 		var t = this.type, tag = this.tagName.toLowerCase(); | ||||||
|  | 		if (re.test(t) || tag == 'textarea' || (includeHidden && /hidden/.test(t)) ) { | ||||||
|  | 			this.value = ''; | ||||||
|  | 		} | ||||||
|  | 		else if (t == 'checkbox' || t == 'radio') { | ||||||
|  | 			this.checked = false; | ||||||
|  | 		} | ||||||
|  | 		else if (tag == 'select') { | ||||||
|  | 			this.selectedIndex = -1; | ||||||
|  | 		} | ||||||
|  | 	}); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * Resets the form data.  Causes all form elements to be reset to their original value. | ||||||
|  |  */ | ||||||
|  | $.fn.resetForm = function() { | ||||||
|  | 	return this.each(function() { | ||||||
|  | 		// guard against an input with the name of 'reset'
 | ||||||
|  | 		// note that IE reports the reset function as an 'object'
 | ||||||
|  | 		if (typeof this.reset == 'function' || (typeof this.reset == 'object' && !this.reset.nodeType)) { | ||||||
|  | 			this.reset(); | ||||||
|  | 		} | ||||||
|  | 	}); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * Enables or disables any matching elements. | ||||||
|  |  */ | ||||||
|  | $.fn.enable = function(b) { | ||||||
|  | 	if (b === undefined) { | ||||||
|  | 		b = true; | ||||||
|  | 	} | ||||||
|  | 	return this.each(function() { | ||||||
|  | 		this.disabled = !b; | ||||||
|  | 	}); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * Checks/unchecks any matching checkboxes or radio buttons and | ||||||
|  |  * selects/deselects and matching option elements. | ||||||
|  |  */ | ||||||
|  | $.fn.selected = function(select) { | ||||||
|  | 	if (select === undefined) { | ||||||
|  | 		select = true; | ||||||
|  | 	} | ||||||
|  | 	return this.each(function() { | ||||||
|  | 		var t = this.type; | ||||||
|  | 		if (t == 'checkbox' || t == 'radio') { | ||||||
|  | 			this.checked = select; | ||||||
|  | 		} | ||||||
|  | 		else if (this.tagName.toLowerCase() == 'option') { | ||||||
|  | 			var $sel = $(this).parent('select'); | ||||||
|  | 			if (select && $sel[0] && $sel[0].type == 'select-one') { | ||||||
|  | 				// deselect all other options
 | ||||||
|  | 				$sel.find('option').selected(false); | ||||||
|  | 			} | ||||||
|  | 			this.selected = select; | ||||||
|  | 		} | ||||||
|  | 	}); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | // expose debug var
 | ||||||
|  | $.fn.ajaxSubmit.debug = false; | ||||||
|  | 
 | ||||||
|  | // helper fn for console logging
 | ||||||
|  | function log() { | ||||||
|  | 	if (!$.fn.ajaxSubmit.debug)  | ||||||
|  | 		return; | ||||||
|  | 	var msg = '[jquery.form] ' + Array.prototype.join.call(arguments,''); | ||||||
|  | 	if (window.console && window.console.log) { | ||||||
|  | 		window.console.log(msg); | ||||||
|  | 	} | ||||||
|  | 	else if (window.opera && window.opera.postError) { | ||||||
|  | 		window.opera.postError(msg); | ||||||
|  | 	} | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | })(jQuery); | ||||||
|  | @ -1,57 +0,0 @@ | ||||||
| <div id="UserRole_block" class="roles_block <%= @class %>"> |  | ||||||
| 	<h2><%= t("admin.user_#{@attribute}") %></h2> |  | ||||||
| 	<div class="info_input"> |  | ||||||
| 		<table border="0" cellspacing="0" cellpadding="0"> |  | ||||||
| 			<thead class="list_head"> |  | ||||||
| 				<tr> |  | ||||||
| 					<td><%= t('admin.key') %></td> |  | ||||||
| 					<% @site_valid_locales.each do |locale| %> |  | ||||||
| 			      	<td><%= I18nVariable.first(:conditions => {:key => locale})[I18n.locale] %></td> |  | ||||||
| 			    	<% end %> |  | ||||||
| 				</tr> |  | ||||||
| 			</thead> |  | ||||||
| 			<tbody> |  | ||||||
| 			<tr class="list_item"> |  | ||||||
| 			    <td><%= is_new ? (f.text_field :key, {:style => "width:150px"}) : @user_attribute_model.key %></td> |  | ||||||
| 			    <% @site_valid_locales.each do |locale| %> |  | ||||||
| 			      <td> |  | ||||||
| 			        <%= text_field_tag "user_#{@attribute}_model[i18n_variable][#{locale}]", (@i18n_variable[locale] if @i18n_variable), :style => "width:150px" %> |  | ||||||
| 			      </td> |  | ||||||
| 			    <% end %> |  | ||||||
| 			  </tr> |  | ||||||
| 			</tbody> |  | ||||||
| 		</table> |  | ||||||
| 	</div> |  | ||||||
| </div> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| <div id="attributes_block" class="roles_block <%= @class %>"> |  | ||||||
| 	<h2>Attributes</h2> |  | ||||||
| 	<div class="info_input"> |  | ||||||
| 		<table id='attributes' border="0" cellspacing="0" cellpadding="0"> |  | ||||||
| 			<thead class="list_head"> |  | ||||||
| 				<tr> |  | ||||||
| 					<td><%= t('admin.key') %></td> |  | ||||||
| 					<td><%= t('admin.multilingual') %></td> |  | ||||||
| 					<% @site_valid_locales.each do |locale| %> |  | ||||||
| 			      	<td><%= I18nVariable.first(:conditions => {:key => locale})[I18n.locale] %></td> |  | ||||||
| 			    	<% end %> |  | ||||||
| 					<td><%= t('admin.type')%></td> |  | ||||||
| 					<td> </td> |  | ||||||
| 				</tr> |  | ||||||
| 			</thead> |  | ||||||
| 			<tfoot> |  | ||||||
| 				<tr> |  | ||||||
| 					<td colspan="5"><a href="#" class="add"><%= t(:add) %></a></td> |  | ||||||
| 				</tr> |  | ||||||
| 			</tfoot> |  | ||||||
| 			<tbody> |  | ||||||
| 				<%= render :partial => 'admin/user_attribute_models/attribute_model', :collection => @user_attribute_model.attribute_models %> |  | ||||||
| 			</tbody> |  | ||||||
| 		</table> |  | ||||||
| 	</div> |  | ||||||
| </div> |  | ||||||
| 
 |  | ||||||
| <% content_for :page_specific_javascript do %> |  | ||||||
| 	<%= javascript_include_tag "user_attribute_model_form" %> |  | ||||||
| <% end -%> |  | ||||||
|  | @ -0,0 +1,513 @@ | ||||||
|  | //Created by Harry Bomrah on Sep 21 2011
 | ||||||
|  | $rss = jQuery.noConflict(); | ||||||
|  | var rcom={ | ||||||
|  | //Pass dom and will return binded dom with starting year till current
 | ||||||
|  | insertDatePanel : function(dom,year){ | ||||||
|  | 	if(!year)year=1901; | ||||||
|  | 	if(dom=="")return false; | ||||||
|  | 	domid=dom.attr("id"); | ||||||
|  | 	var dt = new Date(); | ||||||
|  | 	current_year=dt.getFullYear(); | ||||||
|  | 	var dthtml="Year: <select name='"+domid+"_year'>"; | ||||||
|  | 	for(i=current_year;i>=year;i--){ | ||||||
|  | 		dthtml+="<option value='"+i+"'>"+i+"</option>"; | ||||||
|  | 	} | ||||||
|  | 	dthtml+="</select> Date: <select name='"+domid+"_date'>"; | ||||||
|  | 	for(i=1;i<=31;i++){ | ||||||
|  | 		if(i<10) | ||||||
|  | 			dthtml+="<option value='0"+i+"'>"+i+"</option>"; | ||||||
|  | 		else | ||||||
|  | 			dthtml+="<option value='"+i+"'>"+i+"</option>"; | ||||||
|  | 	} | ||||||
|  | 	dthtml+="</select> Month: <select name='"+domid+"_month'>"; | ||||||
|  | 	var months= Array("","Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"); | ||||||
|  | 	for(i=1;i<12;i++){ | ||||||
|  | 		if(i<10) | ||||||
|  | 			dthtml+="<option value='0"+i+"'>"+months[i]+"</option>"; | ||||||
|  | 		else | ||||||
|  | 			dthtml+="<option value='"+i+"'>"+months[i]+"</option>"; | ||||||
|  | 	} | ||||||
|  | 	dthtml+="</select>";  | ||||||
|  | 	dom.html(dthtml); | ||||||
|  | }, | ||||||
|  | 
 | ||||||
|  | //loading overlay around a dom...
 | ||||||
|  | loadingWrapper : function(dom, display){ | ||||||
|  | 	if(display){ | ||||||
|  | 		dom.prepend("<div id='loading_wrapper' class='loading'></div>"); | ||||||
|  | 		$rss("#loading_wrapper").height(dom.height()); | ||||||
|  | 		$rss("#loading_wrapper").width(dom.width()); | ||||||
|  | 	}else{ | ||||||
|  | 		domId=dom.attr("id"); | ||||||
|  | 		$rss("#"+domId+" #loading_wrapper").remove(); | ||||||
|  | 		} | ||||||
|  | 	}, | ||||||
|  | 	 | ||||||
|  | //validating a dom.... 
 | ||||||
|  | validate : function(dom, validation, errormsg){ | ||||||
|  | 	var domValue = dom.val(); | ||||||
|  | 	var error = false; | ||||||
|  | 	var regex=""; | ||||||
|  | 	var msg = ""; | ||||||
|  | 	switch(validation){ | ||||||
|  | 		case "required": | ||||||
|  | 			if(domValue=="")error=true; | ||||||
|  | 			msg="Cannot be empty."; | ||||||
|  | 			break; | ||||||
|  | 		case "email": | ||||||
|  | 			regex=/^([\w-\.]+@([\w-]+\.)+[\w-]{2,4})?$/; | ||||||
|  | 			msg="Invalid Email Address."; | ||||||
|  | 			break; | ||||||
|  | 		case "number": | ||||||
|  | 			regex=/^\d*[0-9](|.\d*[0-9]|,\d*[0-9])?$/; | ||||||
|  | 			msg = "Only numbers are accepted."; | ||||||
|  | 			break; | ||||||
|  | 		case "alphanumeric": | ||||||
|  | 			regex=/^\s*[a-zA-Z0-9,\s]+\s*$/; | ||||||
|  | 			msg="Only numbers, alphabets and spaces are allowed."; | ||||||
|  | 			break; | ||||||
|  | 		} | ||||||
|  | 		domId=dom.attr("name"); | ||||||
|  | 		if(errormsg=="")errormsg=msg; | ||||||
|  | 		if(regex!="")if(!regex.test(domValue))error=true; | ||||||
|  | 		if(error){$rss("#"+domId+"_error").remove();dom.after("<span id='"+domId+"_error' class='error'>"+errormsg+"</span>");return false;} else{ $rss("#"+domId+"_error").remove();return true;} | ||||||
|  | 	}, | ||||||
|  | 	 | ||||||
|  | bindToSpinner : function(dom,data,callbackFn){ | ||||||
|  | 		var domId = dom.attr("id"); | ||||||
|  | 		var dhtml=""; | ||||||
|  | 		var spinnerValue=Array(); | ||||||
|  | 		var spinnerDisplay=Array(); | ||||||
|  | 		$rss.each(data,function(i,it){ | ||||||
|  | 			$rss.each(data[i],function(key,it){ | ||||||
|  | 				spinnerValue.push(it); | ||||||
|  | 			}); | ||||||
|  | 		}); | ||||||
|  | 		dhtml="<select name='"+domId+"'>"; | ||||||
|  | 		for(i=0,y=1,z=0;i<spinnerValue.length/2;i++,y+=2,z+=2){ | ||||||
|  | 			dhtml+="<option value='"+spinnerValue[z]+"'>"+spinnerValue[y]+"</option>"; | ||||||
|  | 		} | ||||||
|  | 		dhtml+="</select>"; | ||||||
|  | 		dom.html(dhtml); | ||||||
|  | 		if(typeof callbackFn=="function") | ||||||
|  | 			callbackFn.call(this, dhtml); | ||||||
|  | 	}, | ||||||
|  | 	 | ||||||
|  | 	//binds the recieved json to a table
 | ||||||
|  | bindToTable : function(dom,data,headers,actions,css_class,callbackFn){ | ||||||
|  | 	if(!css_class)css_class=""; | ||||||
|  | 	var dhtml="<table width='100%' cellpadding='5' cellspacing='5' class='"+css_class+"' ><thead><tr>"; | ||||||
|  | 	var domId = dom.attr("id"); | ||||||
|  | 	if(actions){ | ||||||
|  | 		var btnTitles=Array(); | ||||||
|  | 		var btnFunctions=Array(); | ||||||
|  | 		$rss.each(actions,function(title,func){ | ||||||
|  | 			btnTitles.push(title); | ||||||
|  | 			btnFunctions.push(func); | ||||||
|  | 		}); | ||||||
|  | 		rcom.translate(btnTitles,function(convertedData){ | ||||||
|  | 				btnTitles=convertedData.slice(); | ||||||
|  | 		 | ||||||
|  | 			rcom.translate(headers,function(convertedData){ | ||||||
|  | 				headers=convertedData; | ||||||
|  | 				if(!data)return; | ||||||
|  | 				$rss.each(headers,function(i,head){ | ||||||
|  | 					dhtml+="<th>"+head+"</th>"; | ||||||
|  | 				}); | ||||||
|  | 				dhtml+="</thead></tr>"; | ||||||
|  | 				if(data.length==0)dhtml+="<tr><td colspan='"+headers.length+"' align='center'>No Data</td></tr>"; | ||||||
|  | 				$rss.each(data,function(i,item){ | ||||||
|  | 					var cl=""; | ||||||
|  | 					if(i%2!=0)cl="even"; | ||||||
|  | 					dhtml+="<tr id='"+domId+"_"+item.id+"' class='"+cl+"'>"; | ||||||
|  | 					$rss.each(item,function(i,it){ | ||||||
|  | 						if(i!="id"){ | ||||||
|  | 							if(it==null)it="Not Set"; | ||||||
|  | 								dhtml+="<td align='center'>"+it+"</td>"; | ||||||
|  | 						} | ||||||
|  | 					}) | ||||||
|  | 					dhtml+="<td align='center'>"; | ||||||
|  | 					for(x=0;x<btnTitles.length;x++){ | ||||||
|  | 						dhtml+="<button onclick='"+btnFunctions[x]+"("+item.id+")'>"+btnTitles[x]+"</button>"; | ||||||
|  | 					} | ||||||
|  | 					dhtml+="</td>"; | ||||||
|  | 					dhtml+="</tr>"; | ||||||
|  | 				}); | ||||||
|  | 				dhtml+="</table>"; | ||||||
|  | 				dom.html(dhtml); | ||||||
|  | 				}); | ||||||
|  | 		}); | ||||||
|  | 	}else{ | ||||||
|  | 			rcom.translate(headers,function(convertedData){ | ||||||
|  | 				headers=convertedData; | ||||||
|  | 				if(!data)return; | ||||||
|  | 				if(headers.length>0){ | ||||||
|  | 					$rss.each(headers,function(i,head){ | ||||||
|  | 						dhtml+="<th>"+head+"</th>"; | ||||||
|  | 					}); | ||||||
|  | 				} | ||||||
|  | 				dhtml+="</thead></tr>"; | ||||||
|  | 				if(data.length==0)dhtml+="<tr><td colspan='"+headers.length+"' align='center'>No Data</td></tr>"; | ||||||
|  | 				 | ||||||
|  | 				$rss.each(data,function(i,item){ | ||||||
|  | 					var cl=""; | ||||||
|  | 					if(i%2!=0)cl="even"; | ||||||
|  | 					dhtml+="<tr id='"+domId+"_"+item.id+"' class='"+cl+"'>"; | ||||||
|  | 					$rss.each(item,function(i,it){ | ||||||
|  | 						if(i!="id"){ | ||||||
|  | 							if(it==null)it="Not Set"; | ||||||
|  | 								dhtml+="<td align='center'>"+it+"</td>"; | ||||||
|  | 						} | ||||||
|  | 					}) | ||||||
|  | 					dhtml+="</tr>"; | ||||||
|  | 				}); | ||||||
|  | 				dhtml+="</table>"; | ||||||
|  | 				dom.html(dhtml); | ||||||
|  | 				});	 | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	if(typeof callbackFn=="function") | ||||||
|  | 		callbackFn.call(this, dhtml); | ||||||
|  | }, | ||||||
|  | 	//convert to date string which can be directly inserted in database or according to any format.
 | ||||||
|  | convertToInsertableDate : function(y,m,d,format){ | ||||||
|  | 		var dt=""; | ||||||
|  | 		if(m<10)m="0"+m; | ||||||
|  | 		if(d<10)d="0"+d; | ||||||
|  | 		switch(format){ | ||||||
|  | 			case "yyyy-mm-dd": | ||||||
|  | 				dt= y+"-"+m+"-"+d; | ||||||
|  | 			break; | ||||||
|  | 			case "dd-mm-yyyy": | ||||||
|  | 				dt= d+"-"+m+"-"+y; | ||||||
|  | 			break; | ||||||
|  | 			case "mm-dd-yyyy": | ||||||
|  | 				dt= m+"-"+d+"-"+y; | ||||||
|  | 			break; | ||||||
|  | 			default: | ||||||
|  | 				dt= y+"-"+m+"-"+d; | ||||||
|  | 			break; | ||||||
|  | 		} | ||||||
|  | 		return dt;  | ||||||
|  | 	}, | ||||||
|  | //a fucntion to show specific divs and hide all other	
 | ||||||
|  | showDoms : function(doms){ | ||||||
|  | 	$rss("body").find("div").each(function(){$rss(this).hide();}); | ||||||
|  | 	$rss.each(doms,function(i,dom){ | ||||||
|  | 			dom.show(); | ||||||
|  | 		}); | ||||||
|  | 	}, | ||||||
|  | 
 | ||||||
|  | //a function to translate the word or array..
 | ||||||
|  | translate : function(data,callbackFn){ | ||||||
|  | 		var cdata=""; | ||||||
|  | 		var status =true; | ||||||
|  | 		if(!data){ | ||||||
|  | 			if(typeof callbackFn=="function") | ||||||
|  | 						callbackFn.call(this,cdata); | ||||||
|  | 				status=false; | ||||||
|  | 			} | ||||||
|  | 		if(data==""){ | ||||||
|  | 			if(typeof callbackFn=="function") | ||||||
|  | 						callbackFn.call(this,cdata); | ||||||
|  | 				status=false; | ||||||
|  | 			} | ||||||
|  | 		if(status){ | ||||||
|  | 			$rss.getJSON("../../classes/translate.php", {fn:"translateThis",tData:data},function(convertedData){			 | ||||||
|  | 				if(typeof callbackFn=="function") | ||||||
|  | 						callbackFn.call(this, convertedData); | ||||||
|  | 			}); | ||||||
|  | 		} | ||||||
|  | 	}, | ||||||
|  | 
 | ||||||
|  | // a function to bind JSON to list
 | ||||||
|  | bindToList : function(dom,data,callbackFn){ | ||||||
|  | 		var domId = dom.attr("id"); | ||||||
|  | 		var dhtml=""; | ||||||
|  | 		var listValue=Array(); | ||||||
|  | 		var listDisplay=Array(); | ||||||
|  | 		$rss.each(data,function(i,it){ | ||||||
|  | 			$rss.each(data[i],function(key,it){ | ||||||
|  | 				listValue.push(it); | ||||||
|  | 			}); | ||||||
|  | 		}); | ||||||
|  | 		dhtml="<ul id='"+domId+"_list'>"; | ||||||
|  | 		for(i=0,y=1,z=0;i<listValue.length/2;i++,y+=2,z+=2){ | ||||||
|  | 			dhtml+="<li id='li_"+listValue[z]+"'>"+listValue[y]+"</li>"; | ||||||
|  | 		} | ||||||
|  | 		dhtml+="</ul>"; | ||||||
|  | 		dom.html(dhtml); | ||||||
|  | 		if(typeof callbackFn=="function") | ||||||
|  | 			callbackFn.call(this,dhtml); | ||||||
|  | 	}, | ||||||
|  | makeDraggable : function(handler,dom){ | ||||||
|  | 	handler.css("position","absolute"); | ||||||
|  | 	dom.css("position","absolute"); | ||||||
|  | 	var puranix=0; | ||||||
|  | 	var nayeex=0; | ||||||
|  | 	var puraniy=0; | ||||||
|  | 	var nayeey=0; | ||||||
|  | 	var offset=""; | ||||||
|  | 	var zIndex=dom.css("z-index"); | ||||||
|  | 		handler.mousedown(function(e){ | ||||||
|  | 			puranix=e.clientX; | ||||||
|  | 			puraniy=e.clientY; | ||||||
|  | 			offset=dom.offset(); | ||||||
|  | 			$rss(this).mousemove(function(e){ | ||||||
|  | 				nayeex=e.clientX-puranix; | ||||||
|  | 				nayeex+=offset.left; | ||||||
|  | 				nayeey=e.clientY-puraniy; | ||||||
|  | 				nayeey+=offset.top; | ||||||
|  | 				dom.css({"left":nayeex+"px","top":nayeey+"px","z-index":"9999"}); | ||||||
|  | 			}) | ||||||
|  | 		}).mouseup(function(){ | ||||||
|  | 			$rss(this).unbind("mousemove"); | ||||||
|  | 			dom.css("z-index",zIndex); | ||||||
|  | 		}) | ||||||
|  | 	}, | ||||||
|  | 	 | ||||||
|  | //automatically scrolls to the bottom of the div	
 | ||||||
|  | scrollToBottom : function(dom){ | ||||||
|  | 	var domId = dom.attr("id"); | ||||||
|  | //	var domScrollHeight = document.getElementById(domId).scrollHeight; 
 | ||||||
|  | 	var obj = document.getElementById(domId); | ||||||
|  | 	 | ||||||
|  | 	if((obj.scrollTop+100) >= (obj.scrollHeight - obj.offsetHeight)) | ||||||
|  | 		dom.scrollTop(obj.scrollHeight); | ||||||
|  | 	}, | ||||||
|  | 	 | ||||||
|  | /*ajax loading of images... needs following settings | ||||||
|  | dom:in which images ve to be loaded | ||||||
|  | url:the server url for making ajax calls | ||||||
|  | limit:how many images to load | ||||||
|  | divClass:the class of div surrounding each image | ||||||
|  | nameClass:class for span showing name | ||||||
|  | fn:function to be called in on the server | ||||||
|  | imageSrc:the image source of all the images. | ||||||
|  | bindTo:to bind images to a onclick function or else will be binded to normal a tag. | ||||||
|  | urlKey:to specify the key of the value.. if bindTo is used, this will be neglected.. | ||||||
|  | returns json; | ||||||
|  | */ | ||||||
|  | loadImages : function(settings,callbackFn){ | ||||||
|  | 
 | ||||||
|  | 		var dom = settings.dom; | ||||||
|  | 		var domid= dom.attr("id"); | ||||||
|  | 		var temp_array=Array(); | ||||||
|  | 		var starting = $rss("#"+domid+" img:last").attr("id"); | ||||||
|  | 		if(typeof starting != 'undefined'){ | ||||||
|  | 			starting = starting.substr(4,starting.length-1);	 | ||||||
|  | 		}else{starting = 0}; | ||||||
|  | 		var temp_var=""; | ||||||
|  | 		var json = ""; | ||||||
|  | 		var dhtml=""; | ||||||
|  | 		var extraparam=""; | ||||||
|  | 		if(typeof settings.extraParam != "undefined"){ | ||||||
|  | 			extraparam = settings.extraParam; | ||||||
|  | 		} | ||||||
|  | 		$rss.getJSON(settings.url,{fn:settings.fn,id:settings.whereId,limit:settings.limit,start:starting,extra:extraparam},function(images){ | ||||||
|  | 				json = eval(images); | ||||||
|  | 				$rss.each(images,function(i,pic){ | ||||||
|  | 					var temp_array=Array(); | ||||||
|  | 					var a_var=Array(); | ||||||
|  | 					var name_var=""; | ||||||
|  | 					var title=""; | ||||||
|  | 					$rss.each(pic,function(i,value){ | ||||||
|  | 						temp_array.push(value); | ||||||
|  | 						}) | ||||||
|  | 						if(temp_array.length>=4){ | ||||||
|  | 							name_var="<span class='"+settings.nameClass+"'>"+temp_array[3]+"</span></div>" 	 | ||||||
|  | 						} | ||||||
|  | 						if(temp_array[2]==null) | ||||||
|  | 							title = ""; | ||||||
|  | 						else | ||||||
|  | 							title = temp_array[2]; | ||||||
|  | 						if(typeof settings.bindTo!="undefined"){ | ||||||
|  | 							a_var[1]="onclick='"+settings.bindTo+"("+temp_array[0]+");return false;'"; | ||||||
|  | 							a_var[0]=""; | ||||||
|  | 						}else{a_var[0]='?'+settings.urlKey+'='+temp_array[0];a_var[1]="";} | ||||||
|  | 					dhtml="<div class='"+settings.divClass+"' id='img_holder_"+temp_array[0]+"' ><a href='"+a_var[0]+"' "+a_var[1]+" title='"+title+"'><img  id='pic_"+temp_array[0]+"' style='display:none' src='"+settings.imageSrc+temp_array[1]+"' /></a>"+name_var; | ||||||
|  | 				dom.delay(100).append(dhtml);	 | ||||||
|  | 				$rss("#pic_"+pic.id).delay(100).fadeIn(200); | ||||||
|  | 				 | ||||||
|  | 				}) | ||||||
|  | 				if(typeof callbackFn=="function") | ||||||
|  | 					callbackFn.call(this,json); | ||||||
|  | 		}) | ||||||
|  | 		 | ||||||
|  | 		 | ||||||
|  | 	}, | ||||||
|  | 	 | ||||||
|  | //function to get url variables...
 | ||||||
|  | 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; | ||||||
|  | }, | ||||||
|  | /*function to open a modalwindow on a page.. self reliant no images, no css needed. | ||||||
|  | settings | ||||||
|  | 
 | ||||||
|  | width:in percentage or pixcel | ||||||
|  | height:in percentage or pixcel | ||||||
|  | closeBtn:true or false | ||||||
|  | envClose:closing through background click, true or flase | ||||||
|  | loadDiv:load html from a div | ||||||
|  | loadPage:load a page | ||||||
|  | loadHtml: load html | ||||||
|  | 
 | ||||||
|  | */ | ||||||
|  | modalWindow : function(settings,callbackFn){ | ||||||
|  | 	 | ||||||
|  | 	var envClose = settings.envClose; | ||||||
|  | 	var dhtml=""; | ||||||
|  | 	if(typeof envClose == "undefined") | ||||||
|  | 		envClose = true; | ||||||
|  | 	var closeBtn = settings.closeBtn; | ||||||
|  | 	if(typeof closeBtn == "undefined") | ||||||
|  | 		closeBtn = true; | ||||||
|  | 
 | ||||||
|  | 	var rgmaskHeight = $rss(window).height(); | ||||||
|  | 	var rgmaskWidth = $rss(window).width(); | ||||||
|  | 	var tempheight = settings.height; | ||||||
|  | 	var tempwidth = settings.width; | ||||||
|  | 		 | ||||||
|  | 	if(typeof tempheight!="undefined"){ | ||||||
|  | 		if(tempheight.charAt(tempheight.length-1)=='%') | ||||||
|  | 			tempheight=(rgmaskHeight*parseInt(tempheight.substr(0,tempheight.length)))/100; | ||||||
|  | 	}else{tempheight="auto";} | ||||||
|  | 
 | ||||||
|  | 	if(typeof tempwidth!="undefined"){ | ||||||
|  | 		if(tempwidth.charAt(tempwidth.length-1)=='%') | ||||||
|  | 			tempwidth=(rgmaskWidth*parseInt(tempwidth.substr(0,tempwidth.length)))/100; | ||||||
|  | 	}else{tempwidth="auto";} | ||||||
|  | 	 | ||||||
|  | 	$rss("body").append('<div class="rgmask" id="rgsheath" style="height:'+rgmaskHeight+'px"></div>'); | ||||||
|  | 	$rss("#rgsheath").css({background: "#000", width: "100%", position: "fixed", top: 0, left: 0,opacity:0.9,'z-index':199}); | ||||||
|  | 	$rss("body").append('<div id="rgWindow"></div>'); | ||||||
|  | 	$rss("#rgWindow").css({"position": "fixed", "z-index": "999", "background": "#fff", "border": "solid 3px #ccc", "padding": "20px",	"overflow": "hidden", "border-radius": "12px", "-webkit-border-radius": "12px", "-moz-border-radius": "12px", "-ms-border-radius": "12px",	"box-shadow": "0 0 20px rgba(0,0,0,0.9)","-webkit-box-shadow": "0 0 20px rgba(0,0,0,0.9)","-moz-box-shadow": "0 0 20px rgba(0,0,0,0.9)","-ms-box-shadow": "0 0 20px rgba(0,0,0,0.9)"}); | ||||||
|  | 		var rgWTop = (rgmaskHeight-20)/2; | ||||||
|  | 		var rgWLeft = (rgmaskWidth-20)/2; | ||||||
|  | 		$rss("#rgWindow").css({top:rgWTop+"px", left:rgWLeft+"px"}); | ||||||
|  | 	if(typeof settings.loadDiv!="undefined"){ | ||||||
|  | 		dhtml = $rss("#"+settings.loadDiv).html(); | ||||||
|  | 		$rss("#rgWindow").html(dhtml).hide(); | ||||||
|  | 		prepareWindow(); | ||||||
|  | 	} | ||||||
|  | 	if(typeof settings.loadHtml!="undefined"){ | ||||||
|  | 		dhtml = settings.loadHtml; | ||||||
|  | 		$rss("#rgWindow").html(dhtml).hide(); | ||||||
|  | 		prepareWindow(); | ||||||
|  | 	} | ||||||
|  | 	if(typeof settings.loadPage!="undefined"){ | ||||||
|  | 		$rss("#rgWindow").load(settings.loadPage,function(){$rss(this).hide();dhtml=$rss(this).html();prepareWindow();}); | ||||||
|  | 	} | ||||||
|  | 	function prepareWindow(){ | ||||||
|  | 		if(tempheight!="auto") | ||||||
|  | 			rgWTop = (rgmaskHeight-tempheight)/2; | ||||||
|  | 		else{ | ||||||
|  | 			tempheight=$rss("#rgWindow").height(); | ||||||
|  | 			rgWTop=(rgmaskHeight-tempheight)/2; | ||||||
|  | 		} | ||||||
|  | 		if(tempwidth!="auto") | ||||||
|  | 			rgWLeft = (rgmaskWidth-tempwidth)/2; | ||||||
|  | 		else{ | ||||||
|  | 			tempwidth=$rss("#rgWindow").width(); | ||||||
|  | 			rgWLeft=(rgmaskWidth-tempwidth)/2; | ||||||
|  | 		} | ||||||
|  | 		$rss("#rgWindow").empty().show(); | ||||||
|  | 		var closebtn = ""; | ||||||
|  | 		if(closeBtn) | ||||||
|  | 			closebtn='<a href="" style="display:block; width:28px; height:28px; line-height:28px; text-align:center; position:absolute; right:6px; top: 6px; font-family:Tahoma; font-weight:bold; border:solid 1px #ccc; border-radius: 15px;text-shadow:1px 1px 0 #fff; background:#f6f6f6; font-size:14px; text-decoration:none; color:#666" id="close_modal">X</a>'; | ||||||
|  | 		$rss("#rgWindow").animate({"width":tempwidth+"px","height":tempheight+"px",top:rgWTop+"px", left:rgWLeft+"px"},500,function(){$rss("#rgWindow").html(closebtn+"<div id='rgContent' style='overflow:auto; overflow-x:none; height:"+tempheight+"px;'>"+dhtml+"</div>"); | ||||||
|  | 		$rss("#close_modal").mouseover(function(){$rss(this).css("color","#999");}).mouseout(function(){$rss(this).css("color","#666");}) | ||||||
|  | 		$rss("#close_modal").click(function(){ | ||||||
|  | 			$rss("#rgWindow").empty(); | ||||||
|  | 			var x = (rgmaskHeight-20)/2; | ||||||
|  | 			var y = (rgmaskWidth-20)/2; | ||||||
|  | 			$rss("#rgWindow").animate({top:x+"px", left:y+"px","width":"50px","height":"50px"},300,function(){$rss(this).fadeOut(100).remove();$rss("#rgsheath").fadeOut(500).remove();}); | ||||||
|  | 			return false; | ||||||
|  | 			}) | ||||||
|  | 			if(envClose) | ||||||
|  | 				$rss("#rgsheath").click(function(){ | ||||||
|  | 					$rss("#rgWindow").empty(); | ||||||
|  | 					var x = (rgmaskHeight-20)/2; | ||||||
|  | 					var y = (rgmaskWidth-20)/2; | ||||||
|  | 					$rss("#rgWindow").animate({top:x+"px", left:y+"px","width":"50px","height":"50px"},300,function(){$rss(this).fadeOut(100).remove();$rss("#rgsheath").fadeOut(500).remove();});}) | ||||||
|  | 					 | ||||||
|  | 			if(typeof callbackFn=="function") | ||||||
|  | 				callbackFn.call(this,dhtml); | ||||||
|  | 		}); | ||||||
|  | 	} | ||||||
|  | }, | ||||||
|  | modalWindowClose : function(callbackFn){ | ||||||
|  | 	if($rss("#rgWindow").length>0){ | ||||||
|  | 		$rss("#rgWindow").empty(); | ||||||
|  | 		var rgmaskHeight = $rss(window).height(); | ||||||
|  | 		var rgmaskWidth = $rss(window).width(); | ||||||
|  | 		var x = (rgmaskHeight-20)/2; | ||||||
|  | 		var y = (rgmaskWidth-20)/2 | ||||||
|  | 		$rss("#rgWindow").animate({top:x+"px", left:y+"px","width":"50px","height":"50px"},300,function(){$rss(this).fadeOut(100).remove();$rss("#rgsheath").fadeOut(500).remove();}) | ||||||
|  | 	} | ||||||
|  | 		if(typeof callbackFn=="function") | ||||||
|  | 				callbackFn.call(this,"harry"); | ||||||
|  | }, | ||||||
|  | bindDomToHead :  function(dom){ | ||||||
|  | 	var gc = dom.css("background"); | ||||||
|  | 	var t = dom.offset(); | ||||||
|  | 	var gw = dom.width(); | ||||||
|  | 	$rss(window).scroll(function(){ | ||||||
|  | 		var wt = $rss(window).scrollTop(); | ||||||
|  | 		if ( wt > t.top ) { | ||||||
|  | 			var cssObj = {  | ||||||
|  | 				'position':'fixed', | ||||||
|  | 				'top':0, | ||||||
|  | 				'width':gw, | ||||||
|  | 				'background':gc, | ||||||
|  | 				'box-shadow':'0 1px 0 rgba(0,0,0,0.2)', | ||||||
|  | 				'z-index':99 | ||||||
|  | 				} | ||||||
|  | 			dom.css(cssObj); | ||||||
|  | 		} else { | ||||||
|  | 			dom.attr('style',""); | ||||||
|  | 		} | ||||||
|  | 	}); | ||||||
|  | }, | ||||||
|  | progressBar : function(dom,settings){ | ||||||
|  | 	var domid = dom.prop("id"); | ||||||
|  | 	if($rss("#rss_progressbar_div_"+domid).length==0){ | ||||||
|  | 		if(typeof settings.top == "undefined") | ||||||
|  | 			settings.value = 1; | ||||||
|  | 		if(typeof settings.top == "undefined") | ||||||
|  | 			settings.top = (dom.height()-12)/2; | ||||||
|  | 		dom.append("<div id='rss_progressbar_div_"+domid+"' style='display:none;padding: 2px;background: #333;background: -webkit-linear-gradient(#111, #333);background: -moz-linear-gradient(#111, #333);background: -ms-linear-gradient(#111, #333);position: absolute;top: "+settings.top+"px;left: 50%;margin-left: -45%;width: 84%;box-shadow: inset 0 0 2px #000;border-radius: 4px;'><div id='rss_progressbar_"+domid+"' style='height: 8px;	background: #36c;background: -webkit-linear-gradient(#7A98E7, #36c);background: -moz-linear-gradient(#7A98E7, #36c);background: -ms-linear-gradient(#7A98E7, #36c);border-radius: 2px; width: "+settings.value+"%;'></div></div>"); | ||||||
|  | 		$rss("#rss_progressbar_div_"+domid).fadeIn(500); | ||||||
|  | 	} | ||||||
|  | }, | ||||||
|  | progressBarValue : function(dom,value){ | ||||||
|  | 	var domid = dom.prop("id"); | ||||||
|  | 	if($rss("#rss_progressbar_div_"+domid).length==1){ | ||||||
|  | 		$rss("#rss_progressbar_"+domid).animate({"width":value+"%"},100); | ||||||
|  | 		 | ||||||
|  | 	} | ||||||
|  | }, | ||||||
|  | progressBarClose : function(dom){ | ||||||
|  | 	var domid = dom.prop("id"); | ||||||
|  | 	$rss("#rss_progressbar_div_"+domid).fadeOut(500,function(){$(this).remove();}); | ||||||
|  | }, | ||||||
|  | getInternetExplorerVersion: function(){ | ||||||
|  |    var rv = -1; // Return value assumes failure.
 | ||||||
|  |    if (navigator.appName == 'Microsoft Internet Explorer') | ||||||
|  |    { | ||||||
|  |       var ua = navigator.userAgent; | ||||||
|  |       var re  = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})"); | ||||||
|  |       if (re.exec(ua) != null) | ||||||
|  |          rv = parseFloat( RegExp.$1 ); | ||||||
|  |    } | ||||||
|  |    return rv; | ||||||
|  |    } | ||||||
|  | } | ||||||
|  | $ = jQuery.noConflict(); | ||||||
|  | @ -12,30 +12,49 @@ class Admin::AssetsController < ApplicationController | ||||||
|   #TODO |   #TODO | ||||||
|   end |   end | ||||||
|    |    | ||||||
|   def edit |  | ||||||
|     @asset = Asset.find(params[:id]) |  | ||||||
|   end |  | ||||||
|    |  | ||||||
|   def new |   def new | ||||||
|     @asset = Asset.new |     @asset = Asset.new | ||||||
|  |     respond_to do |format| | ||||||
|  |       format.html {} | ||||||
|  |       format.js { render 'js/show_pop_up', :locals => {:partial => 'admin/assets/new'} } | ||||||
|  |     end | ||||||
|  |   end | ||||||
|  |    | ||||||
|  |   def edit | ||||||
|  |     @asset = Asset.find(params[:id]) | ||||||
|  |     respond_to do |format| | ||||||
|  |       format.html {} | ||||||
|  |       format.js { render 'js/show_pop_up', :locals => {:partial => 'admin/assets/edit'} } | ||||||
|  |     end | ||||||
|   end |   end | ||||||
|    |    | ||||||
|   def create   |   def create   | ||||||
|     @asset = Asset.new(params[:asset]) |     @asset = Asset.new(params[:asset]) | ||||||
|     if @asset.save |     if @asset.save | ||||||
|       redirect_to admin_assets_url |       respond_to do |format| | ||||||
|  |         format.html { redirect_to admin_assets_url } | ||||||
|  |         format.js { render 'js/remove_pop_up_and_reload_content', :locals => {:function => 'append', :id => 'asset_tbody', :value => @asset, :values => nil, :partial => 'admin/assets/asset', :locals => nil} } | ||||||
|  |       end | ||||||
|     else |     else | ||||||
|       render :action => :new |       respond_to do |format| | ||||||
|  |         format.html { render :action => :new } | ||||||
|  |         format.js { render 'js/reload_content', :locals => {:function => 'html', :id => 'pop_up_content', :value => @asset, :values => nil, :partial => 'admin/assets/new', :locals => {:is_html => false}} } | ||||||
|  |       end | ||||||
|     end |     end | ||||||
|      |  | ||||||
|   end |   end | ||||||
|    |    | ||||||
|   def update |   def update | ||||||
|     @asset = Asset.find(params[:id]) |     @asset = Asset.find(params[:id]) | ||||||
|     if @asset.update_attributes(params[:asset]) |     if @asset.update_attributes(params[:asset]) | ||||||
|       redirect_to admin_assets_url |       respond_to do |format| | ||||||
|  |         format.html { redirect_to admin_assets_url } | ||||||
|  |         format.js { render 'js/remove_pop_up_and_reload_content', :locals => {:function => 'replaceWith', :id => "asset_#{@asset.id}", :value => @asset, :values => nil, :partial => 'admin/assets/asset', :locals => nil} } | ||||||
|  |       end | ||||||
|     else |     else | ||||||
|       render :action => :edit |       respond_to do |format| | ||||||
|  |         format.html { render :action => :edit } | ||||||
|  |         format.js { render 'js/reload_content', :locals => {:function => 'html', :id => 'pop_up_content', :value => @asset, :values => nil, :partial => 'admin/assets/edit', :locals => {:is_html => false}} } | ||||||
|  |       end | ||||||
|     end |     end | ||||||
|      |      | ||||||
|   end |   end | ||||||
|  | @ -43,8 +62,9 @@ class Admin::AssetsController < ApplicationController | ||||||
|   def destroy |   def destroy | ||||||
|     @asset = Asset.find(params[:id]) |     @asset = Asset.find(params[:id]) | ||||||
|     @asset.destroy |     @asset.destroy | ||||||
|      |     respond_to do |format| | ||||||
|     redirect_to admin_assets_url |       format.js { render 'js/remove_element', :locals => {:id => "asset_#{@asset.id}"} } | ||||||
|  |     end | ||||||
|   end |   end | ||||||
|    |    | ||||||
| end | end | ||||||
|  |  | ||||||
|  | @ -0,0 +1,17 @@ | ||||||
|  | <tr id="asset_<%= asset.id %>" class="have"> | ||||||
|  | 	<td><%= asset.id %></td> | ||||||
|  | 	<td><div class="assets_pic"><%= image_tag(asset.data.url) %></div> | ||||||
|  | 	<%#= link_to asset.filename, asset.data.url, :target => '_blank' %> | ||||||
|  | 	</td> | ||||||
|  | 	<td><%= asset.description %></td> | ||||||
|  | 	<td><%= asset.data.file.content_type %></td> | ||||||
|  | 	<td><%= asset.data_filename %></td> | ||||||
|  | 	<td><%= number_to_human_size(asset.data.file.file_length) %></td> | ||||||
|  | 	<td class="action"> | ||||||
|  | 	  <%= link_to t(:edit), edit_admin_asset_path(asset), :remote => true, :class => 'edit' %> | ||||||
|  | 	  <%= link_to t(:delete), admin_asset_path(asset), :confirm => t('sure?'), :method => :delete, :remote => true, :class => 'delete' %> | ||||||
|  | 	</td> | ||||||
|  | </tr> | ||||||
|  | <tr> | ||||||
|  |   <td colspan="5"></td> | ||||||
|  | </tr> | ||||||
|  | @ -0,0 +1,12 @@ | ||||||
|  | <div id='pop_up_content' class="main2"> | ||||||
|  | 	<h1><%= t('editing_asset') %></h1> | ||||||
|  | 
 | ||||||
|  | 	<%= form_for @asset, :url => admin_asset_path(@asset), :html => {:id => 'ajaxForm', :multipart => true } do |f| %> | ||||||
|  | 	  <%= f.error_messages %> | ||||||
|  | 	  <%= render :partial => "form", :locals => { :f => f } %> | ||||||
|  | 	  <div class="button_bar"> | ||||||
|  |     	<%= link_back if is_html %> | ||||||
|  | 			<a id='submit_button'><%= t(:update) %></a> | ||||||
|  | 	  </div> | ||||||
|  | 	<% end %> | ||||||
|  | </div> | ||||||
|  | @ -0,0 +1,14 @@ | ||||||
|  | <div id='pop_up_content' class="main2"> | ||||||
|  | 	<h1><%= t('admin.new_asset') %></h1> | ||||||
|  | 
 | ||||||
|  | 	<%= form_for :asset, :url => admin_assets_path, :html => {:id => 'ajaxForm', :multipart => true }, :remote => true do |f| %> | ||||||
|  | 	  <%= f.error_messages %> | ||||||
|  | 	  <%= render :partial => "form", :locals => { :f => f } %> | ||||||
|  | 	  <div class="button_bar"> | ||||||
|  |     	<%= link_back if is_html %> | ||||||
|  | 			<a id='submit_button'><%= t(:create) %></a> | ||||||
|  | 	  </div> | ||||||
|  | 	<% end %> | ||||||
|  | </div> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | @ -1,548 +0,0 @@ | ||||||
| html, body{ |  | ||||||
|     height: 100%; |  | ||||||
|     margin: 0; |  | ||||||
|     padding: 0; |  | ||||||
| } |  | ||||||
| html{ |  | ||||||
|     background: url(<%= asset_path "body.jpg" %>) no-repeat fixed 0 0 transparent; |  | ||||||
| 	background-size: cover; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| body{ |  | ||||||
|     color: #000000; |  | ||||||
|     font-family: Helvetica, '微軟正黑體'; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| #panel_banner_link{ |  | ||||||
|     background: url(<%= asset_path "orbitbar1.png" %>) repeat-x scroll 0 0; |  | ||||||
|     height: 50px; |  | ||||||
|     left: 0; |  | ||||||
|     position: fixed; |  | ||||||
|     top: 0; |  | ||||||
|     width: 100%; |  | ||||||
| 	z-index: 5; |  | ||||||
| } |  | ||||||
| .hmenu{ |  | ||||||
|     height: 40px; |  | ||||||
|     position: absolute; |  | ||||||
|     right: 0; |  | ||||||
|     top: 1px; |  | ||||||
|     width: 250px; |  | ||||||
| } |  | ||||||
| #orbit{ |  | ||||||
|     background: url(<%= asset_path "bar_orbit.png" %>) no-repeat scroll 0 0 transparent; |  | ||||||
| 	cursor:pointer; |  | ||||||
|     height: 43px; |  | ||||||
|     left: 10px; |  | ||||||
|     position: relative; |  | ||||||
|     width: 41px; |  | ||||||
| } |  | ||||||
| #orbit:hover{ |  | ||||||
| 	background-position:0 -43px; |  | ||||||
|     box-shadow: 0 3px 3px #000000; |  | ||||||
| } |  | ||||||
| #orbit:hover #orblist{ |  | ||||||
| 	display:block; |  | ||||||
| } |  | ||||||
| #orblist{ |  | ||||||
|     background: none repeat scroll 0 0 #FFFFFF; |  | ||||||
|     border-radius: 0 3px 3px 3px; |  | ||||||
|     box-shadow: 0 3px 3px #000000; |  | ||||||
|     display: none; |  | ||||||
|     margin: 0; |  | ||||||
|     padding: 10px; |  | ||||||
|     position: absolute; |  | ||||||
|     top: 43px; |  | ||||||
|     width: 130px; |  | ||||||
| } |  | ||||||
| #orblist li{ |  | ||||||
| 	border-bottom:1px solid #aaa; |  | ||||||
| 	list-style:none; |  | ||||||
| } |  | ||||||
| .orblink{ |  | ||||||
|     color: #333333; |  | ||||||
|     display: block; |  | ||||||
|     font: 12px/100% arial,sans-serif; |  | ||||||
|     padding: 5px; |  | ||||||
|     text-decoration: none; |  | ||||||
| } |  | ||||||
| .orblink:hover{ |  | ||||||
| 	background:#eee; |  | ||||||
| 	color:#333; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| #log_out a{ |  | ||||||
|     background: url(<%= asset_path "service_btn.png" %>) no-repeat scroll right 0 transparent; |  | ||||||
|     border: medium none !important; |  | ||||||
|     display: block !important; |  | ||||||
|     height: 40px !important; |  | ||||||
|     line-height: normal !important; |  | ||||||
|     padding: 0 !important; |  | ||||||
|     position: absolute; |  | ||||||
|     right: 0px; |  | ||||||
|     text-indent: -10000px; |  | ||||||
|     top: 0px; |  | ||||||
|     width: 43px !important; |  | ||||||
| } |  | ||||||
| #log_out a:hover{ |  | ||||||
|     background: url(<%= asset_path "service_btn.png" %>) no-repeat scroll right bottom transparent !important; |  | ||||||
| } |  | ||||||
| .lang{ |  | ||||||
|     color: #FFFFFF; |  | ||||||
|     font-size: 15px; |  | ||||||
|     line-height: 40px; |  | ||||||
|     position: absolute; |  | ||||||
|     right: 55px; |  | ||||||
|     top: 0; |  | ||||||
| } |  | ||||||
| .lang a{ |  | ||||||
| 	color:#fff; |  | ||||||
| 	text-decoration:none; |  | ||||||
| } |  | ||||||
| .lang a:hover{ |  | ||||||
| 	text-decoration:underline; |  | ||||||
| } |  | ||||||
| #content{ |  | ||||||
|     height: 100%; |  | ||||||
| } |  | ||||||
| #panel_footer{ |  | ||||||
| 	background-color: #101010; |  | ||||||
| 	bottom: 0; |  | ||||||
| 	color: #FFFFFF; |  | ||||||
| 	font-size: 11px; |  | ||||||
| 	padding: 10px; |  | ||||||
| 	position: fixed; |  | ||||||
| 	width: 100%; |  | ||||||
| 	left: 0; |  | ||||||
| 	box-shadow: 0 -3px 4px #000; |  | ||||||
| } |  | ||||||
| #search { |  | ||||||
|     background: url(<%= asset_path "search_block_bg.jpg" %>) repeat-x scroll left top transparent; |  | ||||||
|     height: 20px; |  | ||||||
|     margin-top: 43px; |  | ||||||
|     padding: 15px 12px; |  | ||||||
| } |  | ||||||
| #search input { |  | ||||||
|     background: url(<%= asset_path "search_bg.png" %>) no-repeat scroll left top transparent; |  | ||||||
|     border: medium none; |  | ||||||
|     font-family: Helvetica; |  | ||||||
|     height: 20px; |  | ||||||
|     padding: 0 20px; |  | ||||||
|     width: 154px; |  | ||||||
| } |  | ||||||
| /* |  | ||||||
| #sidebar { |  | ||||||
| 	background: url(<%= asset_path "75.png" %>) repeat scroll left top transparent; |  | ||||||
| 	box-shadow: 3px 0 4px #472A12; |  | ||||||
| 	border-right: 1px solid #121212; |  | ||||||
| 	height: 100%; |  | ||||||
| 	left: 0; |  | ||||||
| 	position: fixed; |  | ||||||
| 	top: 0; |  | ||||||
| 	width: 220px; |  | ||||||
| } |  | ||||||
| #sidebar h1 { |  | ||||||
|     background: url(<%= asset_path "h1_bg.png" %>) repeat-x scroll left top transparent; |  | ||||||
|     border-bottom: 1px solid #1B1B1B; |  | ||||||
|     border-top: 1px solid #424344; |  | ||||||
|     color: #FFFFFF; |  | ||||||
|     font-size: 12px; |  | ||||||
|     font-weight: normal; |  | ||||||
|     height: 21px; |  | ||||||
|     line-height: 21px; |  | ||||||
|     margin: 0; |  | ||||||
|     padding-left: 10px; |  | ||||||
|     text-shadow: 0 -1px 0 #000000; |  | ||||||
| } |  | ||||||
| #sidebar .list { |  | ||||||
| 	color:#fff; |  | ||||||
| 	font-size:12px; |  | ||||||
| 	background:url(<%= asset_path "line.png" %>) repeat-x left bottom; |  | ||||||
| } |  | ||||||
| #sidebar .list li { |  | ||||||
| 	background:url(<%= asset_path "sidebar_li.jpg" %>) repeat-x left top; |  | ||||||
| 	border-top:1px solid #424344; |  | ||||||
| 	border-bottom:1px solid #000000; |  | ||||||
| } |  | ||||||
| #sidebar .list li:hover { |  | ||||||
| 	background-position:left bottom; |  | ||||||
| 	border-top:1px solid #406cc3; |  | ||||||
| 	border-bottom:1px solid #242628; |  | ||||||
| } |  | ||||||
| #sidebar .list li a { |  | ||||||
| 	display: block; |  | ||||||
|     padding: 7px 0 6px 12px; |  | ||||||
| 	color:#c4c4c4; |  | ||||||
| } |  | ||||||
| #sidebar .list li a span { |  | ||||||
| 	background:url(<%= asset_path "add_mamber.png" %>) left top no-repeat; |  | ||||||
| 	text-shadow: 0px 1px 0px #000; |  | ||||||
| 	line-height: 18px; |  | ||||||
| 	padding: 2px 0 1px 35px; |  | ||||||
| } |  | ||||||
| #sidebar .list li a:hover span { |  | ||||||
| 	background-position:left bottom; |  | ||||||
| 	color:#eeeeee; |  | ||||||
| } |  | ||||||
| #sidebar .users .list .set_1 { |  | ||||||
| 	background-position:left bottom; |  | ||||||
| 	border-top:1px solid #406cc3; |  | ||||||
| 	border-bottom:1px solid #242628; |  | ||||||
| } |  | ||||||
| #sidebar .users .list .set_1 a span { |  | ||||||
| 	background-position:left bottom; |  | ||||||
| 	color:#eeeeee; |  | ||||||
| } |  | ||||||
| #sidebar .roles .list .set_2 { |  | ||||||
| 	background-position:left bottom; |  | ||||||
| 	border-top:1px solid #406cc3; |  | ||||||
| 	border-bottom:1px solid #242628; |  | ||||||
| } |  | ||||||
| #sidebar .roles .list .set_2 a span { |  | ||||||
| 	background-position:left bottom; |  | ||||||
| 	color:#eeeeee; |  | ||||||
| } |  | ||||||
| #sidebar .infos .list .set_3 { |  | ||||||
| 	background-position:left bottom; |  | ||||||
| 	border-top:1px solid #406cc3; |  | ||||||
| 	border-bottom:1px solid #242628; |  | ||||||
| } |  | ||||||
| #sidebar .infos .list .set_3 a span { |  | ||||||
| 	background-position:left bottom; |  | ||||||
| 	color:#eeeeee; |  | ||||||
| } |  | ||||||
| */ |  | ||||||
| .main { |  | ||||||
| 	height: 100%; |  | ||||||
| 	margin-left: 260px; |  | ||||||
| 	padding-right: 40px; |  | ||||||
| 	position: relative; |  | ||||||
| } |  | ||||||
| .main_list { |  | ||||||
|     padding-top: 70px; |  | ||||||
| } |  | ||||||
| .main_list ul { |  | ||||||
| 	clear:both; |  | ||||||
| } |  | ||||||
| #porfile { |  | ||||||
| 	padding-top: 100px; |  | ||||||
| } |  | ||||||
| /*add_buttom*/ |  | ||||||
| .button_bar { |  | ||||||
| 	float: right; |  | ||||||
| 	-moz-box-shadow:inset 0px 1px 0px 0px #666, 0px 0px 3px black; |  | ||||||
| 	-webkit-box-shadow:inset 0px 1px 0px 0px #666, 0px 0px 3px black; |  | ||||||
| 	box-shadow:inset 0px 1px 0px 0px #666, 0px 0px 3px black; |  | ||||||
| 	background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #4f4f4f), color-stop(1, #000000) ); |  | ||||||
| 	background:-moz-linear-gradient( center top, #4f4f4f 5%, #000000 100% ); |  | ||||||
| 	filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#4f4f4f', endColorstr='#000000'); |  | ||||||
| 	background-color:#4f4f4f; |  | ||||||
| 	-moz-border-radius:5px; |  | ||||||
| 	-webkit-border-radius:5px; |  | ||||||
| 	border-radius:5px; |  | ||||||
| 	display:inline-block; |  | ||||||
| 	padding:0; |  | ||||||
| 	margin:10px 0 60px; |  | ||||||
| } |  | ||||||
| .button_bar a { |  | ||||||
| 	text-decoration:none; |  | ||||||
| 	text-shadow:0px -1px 0px #000000; |  | ||||||
| 	font-size:12px; |  | ||||||
| 	color:#EDEDED; |  | ||||||
| 	border-right:1px solid #555; |  | ||||||
| 	-moz-box-shadow:1px 0px 0px black; |  | ||||||
| 	-webkit-box-shadow:1px 0px 0px black; |  | ||||||
| 	box-shadow:1px 0px 0px black; |  | ||||||
| 	padding: 6px 10px 4px; |  | ||||||
| 	display: inline-block; |  | ||||||
| 	float: left; |  | ||||||
| } |  | ||||||
| .button_bar a:active { |  | ||||||
| 	padding: 7px 10px 3px !important; |  | ||||||
| 	text-shadow:0px 1px 0px #000000; |  | ||||||
| 	background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #000000), color-stop(1, #4f4f4f) ); |  | ||||||
| 	background:-moz-linear-gradient( center top, #000000 5%, #4f4f4f 100% ); |  | ||||||
| 	filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#000000', endColorstr='#4f4f4f'); |  | ||||||
| } |  | ||||||
| .button_bar a:last-child, .button_bar input { |  | ||||||
| 	border-right:none; |  | ||||||
| 	-moz-box-shadow:none; |  | ||||||
| 	-webkit-box-shadow:none; |  | ||||||
| 	box-shadow:none; |  | ||||||
| 	-moz-border-radius:0px 5px 5px 0px; |  | ||||||
| 	-webkit-border-radius:0px 5px 5px 0px; |  | ||||||
| 	border-radius:0px 5px 5px 0px; |  | ||||||
| } |  | ||||||
| .button_bar a:first-child { |  | ||||||
| 	-moz-border-radius:5px 0px 0px 5px; |  | ||||||
| 	-webkit-border-radius:5px 0px 0px 5px; |  | ||||||
| 	border-radius:5px 0px 0px 5px; |  | ||||||
| } |  | ||||||
| .button_bar a.new { |  | ||||||
| 	padding: 5px 10px; |  | ||||||
| 	-moz-border-radius:5px; |  | ||||||
| 	-webkit-border-radius:5px; |  | ||||||
| 	border-radius:5px; |  | ||||||
| } |  | ||||||
| .button_bar a:hover { |  | ||||||
| 	color:#FFFFFF; |  | ||||||
| } |  | ||||||
| .button_bar input { |  | ||||||
| 	background-color:transparent; |  | ||||||
| 	text-decoration:none; |  | ||||||
| 	text-shadow:0px -1px 0px #000000; |  | ||||||
| 	font-size:12px; |  | ||||||
| 	color:#EDEDED; |  | ||||||
| 	border-right:1px solid #555; |  | ||||||
| 	border-top:none; |  | ||||||
| 	border-left:none; |  | ||||||
| 	border-bottom:none; |  | ||||||
| 	-moz-box-shadow:1px 0px 0px black; |  | ||||||
| 	-webkit-box-shadow:1px 0px 0px black; |  | ||||||
| 	box-shadow:1px 0px 0px black; |  | ||||||
| 	padding: 3px 10px 1px; |  | ||||||
| 	display: inline-block; |  | ||||||
| 	float: left; |  | ||||||
| } |  | ||||||
| .up { |  | ||||||
| 	margin:10px 0; |  | ||||||
| } |  | ||||||
| #person { |  | ||||||
| 	left: 245px; |  | ||||||
| 	position: fixed; |  | ||||||
| 	text-align: center; |  | ||||||
| 	top: 75px; |  | ||||||
| 	width: 140px; |  | ||||||
| 	background-color:#FFF; |  | ||||||
| 	padding:15px; |  | ||||||
| 	border-radius: 5px; |  | ||||||
| 	-moz-border-radius: 5px; |  | ||||||
| 	-webkit-border-radius: 5px; |  | ||||||
| 	-moz-box-shadow: 0px 0px 4px #180902; /* Firefox */ |  | ||||||
| 	-webkit-box-shadow: 0px 0px 4px #180902;/* Safari 和 Chrome */ |  | ||||||
| 	box-shadow: 0px 0px 4px #180902; /* Opera 10.5 + */ |  | ||||||
| } |  | ||||||
| #file { |  | ||||||
| 	display:none; |  | ||||||
| } |  | ||||||
| #person img { |  | ||||||
| } |  | ||||||
| .user_mail { |  | ||||||
|     border: medium none; |  | ||||||
| 	border:1px solid #DDDDDD; |  | ||||||
|     color: #666666; |  | ||||||
|     font-size: 12px; |  | ||||||
|     width: 140px; |  | ||||||
| } |  | ||||||
| #person label { |  | ||||||
| 	display: block; |  | ||||||
| 	margin: 15px 0 0; |  | ||||||
| } |  | ||||||
| #person label input { |  | ||||||
| } |  | ||||||
| #person label #user_admin { |  | ||||||
| 	float:right; |  | ||||||
| 	margin: 0; |  | ||||||
| } |  | ||||||
| #person label span { |  | ||||||
| 	text-align:left; |  | ||||||
| 	font-size:11px; |  | ||||||
| 	color:#888; |  | ||||||
| 	display:block; |  | ||||||
| } |  | ||||||
| #person select { |  | ||||||
|     border: 1px solid #DDDDDD; |  | ||||||
|     padding: 0; |  | ||||||
|     width: 140px; |  | ||||||
| } |  | ||||||
| #porfile .users{ |  | ||||||
| 	margin-left: 180px; |  | ||||||
| } |  | ||||||
| .roles_block { |  | ||||||
|     background: url(<%= asset_path "75.png" %>) repeat left top; |  | ||||||
| 	min-width:710px; |  | ||||||
| 	margin-bottom:50px; |  | ||||||
| 	position:relative; |  | ||||||
| 	padding-bottom: 20px; |  | ||||||
| 	border-radius: 5px; |  | ||||||
| 	-moz-border-radius: 5px; |  | ||||||
| 	-webkit-border-radius: 5px; |  | ||||||
| 	-moz-box-shadow: 0px 0px 4px #180902; /* Firefox */ |  | ||||||
| 	-webkit-box-shadow: 0px 0px 4px #180902;/* Safari 和 Chrome */ |  | ||||||
| 	box-shadow: 0px 0px 4px #180902; /* Opera 10.5 + */ |  | ||||||
| } |  | ||||||
| .roles_block h2 { |  | ||||||
|     color: #FFFFFF; |  | ||||||
|     font-weight: normal; |  | ||||||
|     margin: 0; |  | ||||||
|     padding: 0; |  | ||||||
|     position: absolute; |  | ||||||
|     text-shadow: 0 3px 2px #000000; |  | ||||||
|     top: -30px; |  | ||||||
| } |  | ||||||
| .main hr { |  | ||||||
| 	height:8px; |  | ||||||
| 	border:none; |  | ||||||
| 	margin:0; |  | ||||||
| 	border-radius: 5px 5px 0px 0px; |  | ||||||
| 	-moz-border-radius: 5px 5px 0px 0px; |  | ||||||
| 	-webkit-border-radius: 5px 5px 0px 0px; |  | ||||||
| 	border-bottom:1px solid #000; |  | ||||||
| } |  | ||||||
| #basic_block hr { |  | ||||||
|     background-color: #666666; |  | ||||||
| } |  | ||||||
| #teacher_block hr { |  | ||||||
|     background-color: #0071A9; |  | ||||||
| } |  | ||||||
| #student_block hr { |  | ||||||
|     background-color: #AF0045; |  | ||||||
| } |  | ||||||
| .info_input { |  | ||||||
| 	padding:10px 20px; |  | ||||||
| } |  | ||||||
| .info_input table { |  | ||||||
| 	color:#fff; |  | ||||||
| 	width:100%; |  | ||||||
| 	font-size:14px; |  | ||||||
| } |  | ||||||
| .info_input table td { |  | ||||||
| 	padding:5px 10px 5px 0; |  | ||||||
| 	width: 10%; |  | ||||||
| } |  | ||||||
| .info_input .list_head { |  | ||||||
| 	background:url(<%= asset_path "line.png" %>) left bottom repeat-x; |  | ||||||
| } |  | ||||||
| .info_input .list_head td { |  | ||||||
| } |  | ||||||
| .info_input .list_item { |  | ||||||
| 	color:#AEAEAE; |  | ||||||
| } |  | ||||||
| .info_input .add { |  | ||||||
| 	display:block; |  | ||||||
| 	padding-left:22px; |  | ||||||
| 	font-size:12px; |  | ||||||
| 	line-height:21px; |  | ||||||
| 	height:19px; |  | ||||||
| 	background:url(<%= asset_path "icon.png" %>) no-repeat -59px 0; |  | ||||||
| 	margin-top: 10px; |  | ||||||
| 	color: #DDDDDD; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .main table { |  | ||||||
| 	width:100%; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .main th { |  | ||||||
| 	color:#fff; |  | ||||||
| } |  | ||||||
| .main td { |  | ||||||
| 	padding-left:20px; |  | ||||||
| 	color:#fff; |  | ||||||
| 	font-size:14px; |  | ||||||
| 	line-height:20px; |  | ||||||
| } |  | ||||||
| .main tr.have td{ |  | ||||||
| 	background: url(<%= asset_path "75.png" %>) repeat left top; |  | ||||||
| 	padding-bottom: 10px; |  | ||||||
| 	padding-top: 10px; |  | ||||||
| 	vertical-align: middle; |  | ||||||
| } |  | ||||||
| .main tr.have td:first-child{ |  | ||||||
| 	border-radius: 5px 0 0 5px; |  | ||||||
| 	-moz-border-radius: 5px 0 0 5px; |  | ||||||
| 	-webkit-border-radius: 5px 0 0 5px; |  | ||||||
| } |  | ||||||
| .main tr.have td:last-child{ |  | ||||||
| 	border-radius: 0 5px 5px 0; |  | ||||||
| 	-moz-border-radius: 0 5px 5px 0; |  | ||||||
| 	-webkit-border-radius: 0 5px 5px 0; |  | ||||||
| } |  | ||||||
| .main thead td { |  | ||||||
| 	line-height:40px; |  | ||||||
| 	font-size:16px; |  | ||||||
| 	text-shadow: 0px 1px 1px #3e2914; |  | ||||||
| } |  | ||||||
| .main thead th { |  | ||||||
| 	line-height:40px; |  | ||||||
| 	font-size:16px; |  | ||||||
| 	text-shadow: 0px 1px 1px #3e2914; |  | ||||||
| } |  | ||||||
| .main thead td.action { |  | ||||||
| 	width:140px; |  | ||||||
| } |  | ||||||
| .main tbody td.roles { |  | ||||||
|     background-image: url(<%= asset_path "roles_type.jpg" %>); |  | ||||||
|     background-repeat: repeat-x; |  | ||||||
| } |  | ||||||
| .main tbody td.teacher { |  | ||||||
|     background-position: 0 -54px; |  | ||||||
| } |  | ||||||
| .main tbody td.student { |  | ||||||
| 	background-position: 0 -5px; |  | ||||||
| } |  | ||||||
| .main tbody td.action a { |  | ||||||
|     background-image: url(<%= asset_path "icon.png" %>); |  | ||||||
|     display: inline-block; |  | ||||||
|     height: 19px; |  | ||||||
|     margin-right: 10px; |  | ||||||
| 	outline:none; |  | ||||||
|     text-indent: -9999px; |  | ||||||
|     width: 19px; |  | ||||||
| 	position: relative; |  | ||||||
| } |  | ||||||
| .main tbody td.action a.show { |  | ||||||
|     background-position: left top; |  | ||||||
| } |  | ||||||
| .main tbody td.action a.show:hover { |  | ||||||
|     background-position: left -19px; |  | ||||||
| } |  | ||||||
| .main tbody td.action a.edit { |  | ||||||
|     background-position: -19px top; |  | ||||||
| } |  | ||||||
| .main tbody td.action a.edit:hover { |  | ||||||
|     background-position: -19px -19px; |  | ||||||
| } |  | ||||||
| .main tbody td.action a.delete { |  | ||||||
|     background-position: -38px top; |  | ||||||
| } |  | ||||||
| .main tbody td.action a.delete:hover { |  | ||||||
|     background-position: -38px -19px; |  | ||||||
| } |  | ||||||
| .main tbody td.action a.download { |  | ||||||
|     background-position: -74px top; |  | ||||||
| } |  | ||||||
| .main tbody td.action a.download:hover { |  | ||||||
|     background-position: -74px -19px; |  | ||||||
| } |  | ||||||
| .main tbody td.action a.switch { |  | ||||||
|     background: url(<%= asset_path "switch.png" %>) no-repeat left 3px; |  | ||||||
|     width: 40px; |  | ||||||
| } |  | ||||||
| .main tbody tr.disable td.action a.switch { |  | ||||||
|     background-position:left bottom; |  | ||||||
| } |  | ||||||
| .main tbody td.action a.delete:hover { |  | ||||||
|     background-position: -38px -19px; |  | ||||||
| } |  | ||||||
| .main tbody tr.have { |  | ||||||
| } |  | ||||||
| .main tbody tr.disable { |  | ||||||
|     opacity: 0.7; |  | ||||||
| } |  | ||||||
| .main tbody tr { |  | ||||||
| 	background:none; |  | ||||||
| 	height:15px; |  | ||||||
| } |  | ||||||
| .main tbody tr.have .assets_pic { |  | ||||||
| 	height: 40px; |  | ||||||
| 	overflow: hidden; |  | ||||||
| 	width: 40px; |  | ||||||
| 	position: relative; |  | ||||||
| } |  | ||||||
| .main tbody tr.have .assets_pic img { |  | ||||||
| 	left: -15%; |  | ||||||
| 	position: absolute; |  | ||||||
| 	top: -15%; |  | ||||||
| 	width: 130%; |  | ||||||
| } |  | ||||||
|  | @ -1,12 +1,9 @@ | ||||||
| <div class="main2"> | <% content_for :secondary do %> | ||||||
| 	<h1><%= t('editing_asset') %></h1> | <div class="assets_setup"> | ||||||
|  |   <ul class="list"> | ||||||
|  | 	<li><%= link_to t(:new_asset, :scope => :admin), new_admin_asset_path, :remote => true, :class => 'button positive' %></li> | ||||||
|  |   </ul> | ||||||
|  | </div> | ||||||
|  | <% end -%> | ||||||
| 
 | 
 | ||||||
| 	<% form_for @asset, :url => admin_asset_path(@asset), :html => { :multipart => true } do |f| %> | <%= render :partial => 'edit', :locals => {:is_html => true} %> | ||||||
| 	  <%= f.error_messages %> |  | ||||||
| 	  <%= render :partial => "form", :locals => { :f => f } %> |  | ||||||
| 	   |  | ||||||
| 	  <p> |  | ||||||
| 		<%= f.submit t('update') %> <%= link_back %> |  | ||||||
| 	  </p> |  | ||||||
| 	<% end %> |  | ||||||
| </div> |  | ||||||
|  | @ -1,7 +1,7 @@ | ||||||
| <% content_for :secondary do %> | <% content_for :secondary do %> | ||||||
| <div class="assets_setup"> | <div class="assets_setup"> | ||||||
|   <ul class="list"> |   <ul class="list"> | ||||||
| 	<li><%= link_to t(:new_asset, :scope => :admin), new_admin_asset_path, :class => 'button positive' %></li> | 	<li><%= link_to t(:new_asset, :scope => :admin), new_admin_asset_path, :remote => true, :class => 'button positive' %></li> | ||||||
|   </ul> |   </ul> | ||||||
| </div> | </div> | ||||||
| <% end -%> | <% end -%> | ||||||
|  | @ -10,35 +10,19 @@ | ||||||
| 	<h1><%= t('admin.list_assets') %></h1> | 	<h1><%= t('admin.list_assets') %></h1> | ||||||
| 
 | 
 | ||||||
| 	<table> | 	<table> | ||||||
| 	<thead> | 		<thead> | ||||||
| 	  <tr> | 		  <tr> | ||||||
| 		  <td><%= t('admin.id') %></th> | 			  <td><%= t('admin.id') %></th> | ||||||
| 		  <td><%= t('admin.file_name') %></th> | 			  <td><%= t('admin.file_name') %></th> | ||||||
| 		  <td><%= t('admin.description') %></th> | 			  <td><%= t('admin.description') %></th> | ||||||
| 		  <td><%= t('admin.format') %></th> | 			  <td><%= t('admin.format') %></th> | ||||||
| 		  <td><%= t('admin.orig_upload_file') %></th> | 			  <td><%= t('admin.orig_upload_file') %></th> | ||||||
| 		  <td><%= t('admin.file_size') %></th> | 			  <td><%= t('admin.file_size') %></th> | ||||||
| 		  <td><%= t('admin.action') %></th> | 			  <td><%= t('admin.action') %></th> | ||||||
| 	  </tr> | 		  </tr> | ||||||
| 	</thead> | 		</thead> | ||||||
| 	<% @assets.each do |asset| %> | 		<tbody id='asset_tbody'> | ||||||
| 	  <tr class="have"> | 			<%= render :partial => 'asset', :collection => @assets %> | ||||||
| 		<td><%= asset.id %></td> | 		<tbody> | ||||||
| 		<td><div class="assets_pic"><%= image_tag(asset.data.url) %></div> |  | ||||||
| 		<%#= link_to asset.filename, asset.data.url, :target => '_blank' %> |  | ||||||
| 		</td> |  | ||||||
| 		<td><%= asset.description %></td> |  | ||||||
| 		<td><%= asset.data.file.content_type %></td> |  | ||||||
| 		<td><%= asset.data_filename %></td> |  | ||||||
| 		<td><%= number_to_human_size(asset.data.file.file_length) %></td> |  | ||||||
| 		<td class="action"> |  | ||||||
| 		  <%= link_to t(:edit), edit_admin_asset_path(asset), :class => 'edit' %> |  | ||||||
| 		  <%= link_to t(:delete), admin_asset_path(asset), :confirm => t('sure?'), :method => :delete, :class => 'delete' %> |  | ||||||
| 		</td> |  | ||||||
| 	  </tr> |  | ||||||
|       <tr> |  | ||||||
|         <td colspan="5"></td> |  | ||||||
|       </tr> |  | ||||||
| 	<% end %> |  | ||||||
| 	</table> | 	</table> | ||||||
| </div> | </div> | ||||||
|  | @ -1,12 +1,9 @@ | ||||||
| <div class="main2"> | <% content_for :secondary do %> | ||||||
| 	<h1><%= t('admin.new_asset') %></h1> | <div class="assets_setup"> | ||||||
|  |   <ul class="list"> | ||||||
|  | 	<li><%= link_to t(:new_asset, :scope => :admin), new_admin_asset_path, :remote => true, :class => 'button positive' %></li> | ||||||
|  |   </ul> | ||||||
|  | </div> | ||||||
|  | <% end -%> | ||||||
| 
 | 
 | ||||||
| 	<%= form_for :asset, :url => admin_assets_path, :html => { :multipart => true } do |f| %> | <%= render :partial => 'new', :locals => {:is_html => true} %> | ||||||
| 	  <%= f.error_messages %> |  | ||||||
| 	  <%= render :partial => "form", :locals => { :f => f } %> |  | ||||||
| 	  <div class="button_bar"> |  | ||||||
|     	<%= link_back %> |  | ||||||
| 		<%= f.submit t('create') %> |  | ||||||
| 	  </div> |  | ||||||
| 	<% end %> |  | ||||||
| </div> |  | ||||||
|  | @ -0,0 +1,8 @@ | ||||||
|  | var to_render = ''; | ||||||
|  | <% if value %> | ||||||
|  | 	to_render = "<%= escape_javascript(render(:partial => partial, :object => value, :locals => locals)) %>" | ||||||
|  | <% elsif values %> | ||||||
|  | 	to_render = "<%= escape_javascript(render(:partial => partial, :collection => values, :locals => locals)) %>" | ||||||
|  | <% end %> | ||||||
|  | 
 | ||||||
|  | $("#<%= id %>").<%= function %>(to_render); | ||||||
|  | @ -0,0 +1 @@ | ||||||
|  | $("#<%= id %>").remove() | ||||||
|  | @ -0,0 +1,2 @@ | ||||||
|  | rcom.modalWindowClose(); | ||||||
|  | <%= render :template => 'js/reload_content', :locals => {:function => function, :id => id, :value => value, :values => values, :partial => partial, :locals => locals} %> | ||||||
|  | @ -0,0 +1 @@ | ||||||
|  | rcom.modalWindow({loadHtml:"<%= escape_javascript(render(:partial => partial, :locals => {:is_html => false})) %>"}); | ||||||
|  | @ -1,36 +0,0 @@ | ||||||
| <!DOCTYPE HTML> |  | ||||||
| <html> |  | ||||||
| <head> |  | ||||||
| 	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> |  | ||||||
| 	<title><%= @title || APP_CONFIG['orbit'] %></title> |  | ||||||
| 	<link rel="shortcut icon" href="/favicon.ico"> |  | ||||||
| 	<%= stylesheet_link_tag "admin" %> |  | ||||||
| 	<%= javascript_include_tag "admin" %> |  | ||||||
| 	<%= yield :page_specific_css %> |  | ||||||
| 	<%= yield :page_specific_javascript %> |  | ||||||
| 	<%= csrf_meta_tag %> |  | ||||||
| </head> |  | ||||||
| <body> |  | ||||||
| 
 |  | ||||||
| 	<div id="panel_banner_link" > |  | ||||||
| 		<div id="orbit"><%= render 'layouts/drop_down_menu' %></div>	 |  | ||||||
| 		<div class="hmenu"> |  | ||||||
| 			<div class="lang"><%= render 'layouts/lang_menu' %></div> |  | ||||||
| 			<%= render 'devise/menu/login_items' %> |  | ||||||
| 		</div> |  | ||||||
| 	</div> |  | ||||||
| 	 |  | ||||||
| 	<div id="panel_container"> |  | ||||||
| 		<div id="panel_content"> |  | ||||||
| 			<div class="secondary"> |  | ||||||
| 				<div class="secondary2"><%= yield :secondary %></div> |  | ||||||
| 			</div> |  | ||||||
| 			<div class="main"> |  | ||||||
| 				<div class="main2"><%= yield %></div> |  | ||||||
| 			</div> |  | ||||||
| 			<div class="tertiary"><%= yield :tertiary %></div> |  | ||||||
| 		</div> |  | ||||||
| 		<div id="panel_footer"><p><%= APP_CONFIG['ruling_digital'] %></p></div> |  | ||||||
| 	</div> |  | ||||||
| </body> |  | ||||||
| </html> |  | ||||||
		Loading…
	
		Reference in New Issue