/** @file diehard_gallery_image.js @brief Copyright 2009 Creative Crew. All rights reserved. @author William Chang Email: william@babybluebox.com Website: http://www.babybluebox.com @version 0.1 @date - Created: 2009-02-06 - Modified: 2009-03-16 . @note Prerequisites: - jQuery http://www.jquery.com/ - jQuery UI http://ui.jquery.com/ - Dialog http://docs.jquery.com/UI/Dialog - Tabs http://docs.jquery.com/UI/Tabs . - Yahoo! UI Library (YUI) http://developer.yahoo.com/yui/ - JSON http://developer.yahoo.com/yui/json/ . . References: - General: - http://blog.jeremymartin.name/2008/02/building-your-first-jquery-plugin-that.html - http://en.wikipedia.org/wiki/Object_copy . . */ // Image gallery widget. (function($){ // Plugin for jQuery. $.fn.diehard_gallery_image = function(options) { // Validate prerequisites. if(!$.fn.dialog) {throw('Dependency Error: jQuery UI Dialog widget is missing.');} if(!$.fn.tabs) {throw('Dependency Error: jQuery UI Tabs widget is missing.');} // Iterate and return each selected element back to library's chain. return this.each(function(_intIndex) { /** On event, item add. */ function _onItemAdd(e) { var eleFormFooter = $('.footer', _elePanelAdd).get(0); var eleFormClose = $('.ajax-dialog-cancel', _elePanelAdd).unbind().bind('click', function(e) { _elePanelItems.style.display = 'block'; _elePanelAdd.style.display = 'none'; return false; }).get(0); _elePanelItems.style.display = 'none'; _elePanelAdd.style.display = 'block'; // Create iframe. var eleIframe = _createIframeDialog(_elePanelAdd, 'iframe_gallery_add', '', function(e) { if(isEmpty(this.contentWindow.result)) { // Get iframe's input element. var eleIframeInput = $(this).contents().find('form input.ajax-form-submit').get(0); // Get existing external's input element. var eleDialogInput = document.getElementById(eleIframeInput.id); // Remove existing external's element if exist. if(!isEmpty(eleDialogInput)) {$(eleDialogInput).remove();} // Prepend input markup code and create external's input element (deep copy). eleDialogInput = $('', eleIframe).prependTo(eleFormFooter).get(0); // Bind event to external's input element. $(eleDialogInput).unbind().bind('click', function(e) { // Trigger event on iframe's input element. $(eleIframeInput).trigger('click'); }); } else { // Get result from iframe's server-side postback. result = this.contentWindow.result; // Close panel. $(eleFormClose).trigger('click'); // Select tab. if(result.boolItemPublic) { $(_elePanelItemsTabs).tabs('select', 1); } else { $(_elePanelItemsTabs).tabs('select', 0); } // Append id to data. var intPageSelected = _intAryPageSelected[_objCurrent.intGroupIndex] - 1; if(isEmpty(_strAryItemIds[_objCurrent.intGroupIndex][intPageSelected])) { _strAryItemIds[_objCurrent.intGroupIndex][intPageSelected] += result.intItemId.toString(); } else { _strAryItemIds[_objCurrent.intGroupIndex][intPageSelected] += ',' + result.intItemId; } // Create item by id. $(_objCurrent.eleItems).append(_createItem(result.intItemId)); } }); } /** On event, item select. */ function _onItemSelect(e) { // Get id for database. var intCharacterIndex = this.id.lastIndexOf('_') + 1; var strValue = this.id.substring(intCharacterIndex, this.id.length); // Get inner. var eleItemInner = $('img', this).get(0); // Create markup code for selected item's container. var eleItemSelected = $('
Click here for image gallery.
'); // Clone and prepend selected item to container. $(eleItemInner).clone().prependTo(eleItemSelected); // Insert selected item after the external event element. $(eleItemSelected).insertAfter(_objCurrent.eleExchange).bind('click', _onWindowOpen); // Remove external event element. $(_objCurrent.eleExchange).remove(); // Set new external event element. _objCurrent.eleExchange = eleItemSelected; // Set selected value to input hidden. var eleHiddenDataSelected = $(eleItemSelected).next('input[type=\"hidden\"]').get(0); if(!isEmpty(eleHiddenDataSelected)) { eleHiddenDataSelected.value = parseInt(strValue, 10); } else { throw('Error: The input hidden element next to the external event element is missing, it is require to save selection to database.'); } // Close dialog. $(_eleDialogClose).trigger('click'); // Prevent default action. return false; } /** On event, page change. */ function _onPageChange(e) { var intPageIndex = this.selectedIndex; _intAryPageSelected[_objCurrent.intGroupIndex] = parseInt(this.options[intPageIndex].value, 10); // Create items by id. var intPageSelected = _intAryPageSelected[_objCurrent.intGroupIndex] - 1; if(isEmpty(_strAryItemIds[_objCurrent.intGroupIndex][intPageSelected])) {return;} _createItems(_strAryItemIds[_objCurrent.intGroupIndex][intPageSelected]); } /** On event, tab show. */ function _onTabShow(e, ui) { // Set current object. _objCurrent.intGroupIndex = ui.index; _objCurrent.eleItems = ui.panel; // Create number of pages. _createPaging(_strAryItemIds[_objCurrent.intGroupIndex].length, _intAryPageSelected[_objCurrent.intGroupIndex]); // Create (load) items after opening the dialog. if($(_eleWindow).dialog('isOpen')) {$(_elePaging).trigger('change');} } /** On event, window open. */ function _onWindowOpen(e) { _objCurrent.eleExchange = this; _elePanelItems.style.display = 'block'; _createWindow(); // Load items. $(_elePaging).trigger('change'); // Prevent default action. return false; } /** Parse items from query string. */ function _parseQueryStringItems() { for(var intIndex1 = 0;intIndex1 < _eleAryHiddenData.length;intIndex1++) { // Get data from input hidden, get pages from query string. var intPageLength = parseInt(getQueryStringValue(_eleAryHiddenData[intIndex1].value, 'pageslength'), 10); _strAryItemIds[intIndex1] = []; for(var intIndex2 = 0;intIndex2 < intPageLength;intIndex2++) { // Get data from input hidden, get items from query string _strAryItemIds[intIndex1][intIndex2] = getQueryStringValue(_eleAryHiddenData[intIndex1].value, 'images_' + (intIndex2 + 1)); } } } /** Create iframe for dialog. */ function _createIframeDialog(elePlaceholder, strFrameId, strQueryString, fnCallback) { // Get iframe location. var eleLocation = $('.iframe_location', elePlaceholder).get(0); var iframeSrc = $(eleLocation, elePlaceholder).html(); if(iframeSrc.indexOf('?') < 0){ if(!isEmpty(strQueryString)) {strQueryString = '?' + strQueryString;} } else { if(!isEmpty(strQueryString)) {strQueryString = '&' + strQueryString;} } // Init. var eleForm = $(eleLocation).parent().get(0); var eleExist = document.getElementById(strFrameId); if(!isEmpty(eleExist)) { eleForm.removeChild(eleExist); } // Load and prepend to dialog. var eleIframe = $('').prependTo(eleForm).get(0); // Bind load event for function callback. $(eleIframe).bind('load', function(e) { if(jQuery.isFunction(fnCallback)) {fnCallback.call(this, e);} }); return eleIframe; } /** Create dialog (require jQuery UI Dialog). */ function _createDialog(ele) { $(ele).dialog({ modal:true, resizable:false, draggable:false, width:_eleThis.options.intWindowWidth, height:_eleThis.options.intWindowHeight }); ele.style.display = 'block'; // Bind close event. $(_eleDialogClose).unbind().bind('click', function(e) {$(ele).dialog('destroy');return false;}); } /** Create an item. */ function _createItem(intItemId) { // Create element from markup code. var ele = $('
').get(0); // Bind item event. $(ele).bind('click', _onItemSelect); // Return element. return ele; } /** Create items. */ function _createItems(strItems) { // Parse delimited string. var strValues = strItems.split(','); // Remove existing items. $('*', _objCurrent.eleItems).remove(); // Create items. for(var intIndex = 0;intIndex < strValues.length;intIndex++) { var intId = parseInt(strValues[intIndex], 10); // Append to items. $(_objCurrent.eleItems).append(_createItem(intId)); } } /** Create paging. */ function _createPaging(intLength, intSelected) { // Remove existing items. $('*', _elePaging).remove(); // Create items. for(var intIndex = 1;intIndex <= intLength;intIndex++) { var strAttribute = ''; if(intSelected == intIndex) {strAttribute = ' selected=\"selected\"';} // Create markup code and append to list. $(_elePaging).append('' + intIndex + ''); } } /** Create window. */ function _createWindow() { // Create modal dialog. _createDialog(_eleWindow); } /** Remove URL before the location hash (aka pound sign or anchor). Fix is only for Microsoft Internet Explorer 7. */ function _removeUrlBeforeLocationHash(eleLinks) { if(!$.browser.msie && parseInt($.browser.version, 10) != 7) {return;} $(eleLinks).each(function(intIndex) { // Get hash after the location hash (aka pound sign or anchor). var strHref = $('*[href]', this).eq(0).attr('href'); var intCharacterIndex = strHref.lastIndexOf('#'); var strHash = strHref.substring(intCharacterIndex, strHref.length); $('*[href]', this).eq(0).attr('href', strHash); }); } /** Create items panel from makeup code. */ function _createPanelItems() { _elePanelItems = $('
').appendTo(_eleWindow).get(0); _elePanelItems.style.display = 'none'; // Create footer from markup code. _eleFooter = $('
Select Image From Gallery
').appendTo(_elePanelItems).get(0); _eleControlPanelLeft = $('
Page
').prependTo(_eleFooter).get(0); _eleControlPanelRight = $('
').prependTo(_eleFooter).get(0); _elePaging = $('').appendTo(_eleControlPanelLeft).get(0); _eleListAdd = $('').appendTo(_eleControlPanelRight).get(0); _eleDialogClose = $('').appendTo(_eleControlPanelRight).get(0); // Create frame for the tabs and panels. var elePanelItemsTabsFrame = $('
').prependTo(_elePanelItems).get(0); // Create tabs from markup code. _elePanelItemsTabs = $('').appendTo(elePanelItemsTabsFrame).get(0); $('
  • Private
  • ').appendTo(_elePanelItemsTabs); $('
  • Public
  • ').appendTo(_elePanelItemsTabs); _removeUrlBeforeLocationHash($('> *', _elePanelItemsTabs).get()); // Create panels for tabs from markup code. $('
    ').appendTo(elePanelItemsTabsFrame); $('
    ').appendTo(elePanelItemsTabsFrame); // Create tabs. $(_elePanelItemsTabs).tabs({show:_onTabShow}); // Parse makeup code for tabs. /*var elePanelItemsTabsFrame = $('#' + _eleThis.options.strWindowId + '-items-tabs-frame').prependTo(_elePanelItems).get(0); elePanelItemsTabsFrame.style.display = 'block'; // Create tabs. _elePanelItemsTabs = $('#' + _eleThis.options.strWindowId + '-items-tabs', elePanelItemsTabsFrame).tabs({show:_onTabShow}).get(0);*/ // Bind events. $(_elePaging).unbind().bind('change', _onPageChange); $(_eleListAdd).bind('click', _onItemAdd); } /** Create add panel from makeup code. */ function _createPanelAdd() { _elePanelAdd = $('
    ').appendTo(_eleWindow).get(0); _elePanelAdd.style.display = 'none'; $('
    ' + _eleThis.options.strUrlAdd + '
     
    ').appendTo(_elePanelAdd); } /** Create external events. */ function _createExternalEvents() { $('.' + _eleThis.options.strWindowId + '-trigger_open', _eleRegion).each(function(intIndex) { $(this).unbind().bind('click', _onWindowOpen); }); } /** Load widget. */ this.load = function _load() { _eleRegion = $('#' + _eleThis.options.strRegionId).get(0); _eleWindow = _eleThis; if(_eleWindow.id.length > 0) { _eleThis.options.strWindowId = _eleWindow.id; } _eleAryHiddenData[0] = $('#' + _eleThis.options.strHiddenDataPrivateId, _eleRegion).get(0); _eleAryHiddenData[1] = $('#' + _eleThis.options.strHiddenDataPublicId, _eleRegion).get(0); _eleWindow.style.display = 'none'; _parseQueryStringItems(); _createPanelItems(); _createPanelAdd(); _createExternalEvents(); } /** Init library. */ this.init = function init(options) { var defaults = { strRegionId:'region-middle', strWindowId:'gallery', intWindowWidth:640, intWindowHeight:480, strHiddenDataPublicId:'', strHiddenDataPrivateId:'', strUrlQueryStringItemId:'&id', strUrlItem:'', strUrlAdd:'' }; return $.extend(defaults, options); } // Fields. var _eleRegion, _eleWindow, _elePanelItems, _elePanelItemsTabs, _elePanelAdd; var _eleControlPanelLeft, _eleControlPanelRight, _elePaging, _eleListAdd, _eleDialogClose; var _eleAryHiddenData = []; var _strAryItemIds = []; // Two dimensional array, later. var _intAryPageSelected = [1, 1]; var _objCurrent = { intGroupIndex:null, eleItems:null, eleExchange:null }; // Procedural. var _eleThis = this; _eleThis.options = _eleThis.init(options); _eleThis.load(); }); }; })(jQuery);