/**
 * Javascript gallery controller library
 *
 * LICENSE: This code is licenced to skinflips.com
 *
 * @package    DACH_SHOP
 * @subpackage PHP_WEBSITE 
 * @copyright  2010 Tortoise Design GmbH
 * @license    http://www.skinflips.com
 * @author     Ivana Djordjevic <ivana.djordjevic@softserbia.com>
 * @version    $Id: jsGalleryLib.js 2652 2010-07-23 11:58:45Z ivana $
 * @link       http://www.skinflips.com
 * @since      File available since Release 0
*/


/**
 * object: Javascript gallery controller library 
 *
 * This object contains functions that can be used on gallery page
 *
 * notice: prototype javascript framework needed          
 *
 * @author Ivana Djordjevic <ivana.djordjevic@softserbia.com>
 * @param  void
 * @return void
*/
var jsGalleryLib = {

  zendUrlKeyPrefix: ['-id'],           // key prefixes for zend url params

  designUrlParams: null,               // design url params
  
  designsInfo: null,                   // designs information (design id, design name, designer's name)
  
  pageTitle: null,                     // page title

  clickedOutsideElementParams: '',     //  url params for clickedOutsideElement function
  
  deviceActiveId: null,                // active Id
  
  // blink text on the SKINS page
  blinkTextCounter: 0,
  blinkTimeOut: 1000,
  blinkTimeoutAfterward: 2000,
  blinkClearTimeOut: null,
 
  /**
   * function: It updates container box of designs
   * 
   * @author Ivana Djordjevic <ivana.djordjevic@softserbia.com>
   * @param  {Object} object // Html <a> element
   * @return void  
  */
  updateDesignBox: function(href) {
    var url = jsCommonLib.siteUrl + '/designs/index/';

    // parse zend url
    var params = jsGalleryLib.parseZendUrl(href);
    
    var ajax = new Ajax.Updater({
      success: 'designs-box-content-list'
    }, url, {
      method: 'get',
      parameters: params,
      evalScripts: true,
      onSuccess: function(transport) {
        setTimeout('jsGalleryLib.updatePageTitle()', 200);
        setTimeout('jsGalleryLib.showHideBackLink()', 200);
        setTimeout('zoomToolLib.setMouseOver()', 200);
      }
    });

    // unset cookie for designs div scroll position 
    jsCommonLib.eraseCookie('designsDivScrollPosition' + this.getDeviceActiveId());
  },


  /**
   * function: It updates main page title
   * 
   * @author Slavisa Miljanovic <slavisa.miljanovic@softserbia.com>
   * @param  void
   * @return void  
  */
  updatePageTitle: function() {
    var span = $$('.designs-container-title h1 span');
    var pageTitleContainer = span[0];
    pageTitleContainer.innerHTML = jsGalleryLib.pageTitle;
  },

  
  /**
   * function: This function updates device box
   * 
   * @author Ivana Djordjevic <ivana.djordjevic@softserbia.com>
   * @param  {Object} object // Html <a> element
   * @return void  
  */
  updateDevicesBox: function(object) {
    var url = jsCommonLib.siteUrl + '/devices/index/';
    
    // parse seo url
    // var params = jsGalleryLib.parseSeoUrl(object.href);
    // parse zend url
    var params = jsGalleryLib.parseZendUrl(object.href);
    var ajax = new Ajax.Updater({success: 'devicesContentBox'}, url, {method: 'get', parameters: params});
  },

  /**
   * function: This function updates device box with devices categories
   * 
   * @author Ivana Djordjevic <ivana.djordjevic@softserbia.com>
   * @param  {Object} object // Html <a> element
   * @return void
   * TODO params u gallery kontroleru, za sad su korisceni jsGalleryLib.clickedOutsideElementParams
  */
  selectDeviceCategories: function(object) {
    var url = jsCommonLib.siteUrl + '/devices/select-category/' + jsGalleryLib.clickedOutsideElementParams;
    
    // parse zend url
    //var params = jsGalleryLib.parseZendUrl(object.href);
    //params += jsGalleryLib.clickedOutsideElementParams;
    
    if ($('device-img-container') != null) {
      var ajax = new Ajax.Updater({success: 'devicesContentBox'}, url,{method: 'get', parameters: ''});
    }

    $j(".device-back").click(function(){
      var ajax = new Ajax.Updater({success: 'devicesContentBox'}, url,{method: 'get', parameters: ''});
    });

  },

  /**
   * function: This function updates device box with devices manufacturers
   * 
   * @author Ivana Djordjevic <ivana.djordjevic@softserbia.com>
   * @param  {Object} object // Html <a> element
   * @return void  
  */
  selectManufacturer: function(object) {
    var url = jsCommonLib.siteUrl + '/devices/select-manufacturer/';
    
    // parse zend url
    var params = jsGalleryLib.parseZendUrl(object.href);

    var ajax = new Ajax.Updater({success: 'devicesContentBox'}, url,{method: 'get', parameters: params});
    
  },

  /**
   * function: measurements
   * 
   * @author Ivana Djordjevic <ivana.djordjevic@softserbia.com>
   * @param  {Object} object // Html <a> element
   * @return void  
  */
  measurements: function(object) {
    var url = jsCommonLib.siteUrl + '/devices/measurements/';
    
    // parse zend url
    var params = jsGalleryLib.parseZendUrl(object.href);

    var ajax = new Ajax.Updater({success: 'devicesContentBox'}, url,{method: 'get', parameters: params});
    
  },

  /**
   * function: This function updates device box with devices from selected manufacturer
   * 
   * @author Ivana Djordjevic <ivana.djordjevic@softserbia.com>
   * @param  {Object} object // Html <a> element
   * @return void  
  */
  selectDevices: function(object) {
    var url = jsCommonLib.siteUrl + '/devices/show-from-manufacturer/';
    
    // parse zend url
    var params = jsGalleryLib.parseZendUrl(object.href);

    var ajax = new Ajax.Updater({success: 'devicesContentBox'}, url,{method: 'get', parameters: params});
  },

  /**
   * function: This function updates device box with devices from selected manufacturer
   * 
   * @author Ivana Djordjevic <ivana.djordjevic@softserbia.com>
   * @param  {String} selectedLaptopSide  Selected side of laptop
   * @param  {Int} designMotivId  // Selected design motiv
   * @return namber  
  */
  showSelectedLaptopSide: function(selectedLaptopSide, designId, activeId) {
    var url = jsCommonLib.siteUrl + '/devices/show-selected-laptop-side';

    var params = '?laptop-side=' + selectedLaptopSide; 
        params += '&design-id-' + activeId + '=' + designId;

    var ajax = new Ajax.Request(url, {method: 'get', parameters: params, onComplete: function(transport) {var jsonResponse = transport.responseText.evalJSON(true);jsGalleryLib.updateAfetrCnangeSide(jsonResponse);}});

  },

  /**
   * function: Changes skin and skin price after chagne laptop side
   * 
   * @author Ivana Djordjevic <ivana.djordjevic@softserbia.com>
   * @return void  
  */  
  updateAfetrCnangeSide: function(jsonResponse){
    $('skin-price').innerHTML = jsonResponse['skin-price'];
    $('skin-shipping-cost').innerHTML = jsonResponse['skin-shipping-cost'];
    $('show-device').innerHTML = jsonResponse['skin'];
    $('add-to-cart-link').className = jsonResponse['add-to-cart-link'];
  },
  
  /**
   * function: This function compares the different skins on devices
   * 
   * @author Ivana Djordjevic <ivana.djordjevic@softserbia.com>
   * @param  {Object} object // Html <a> element
   * @return void  
  */
  compareDevices: function(object) {

    var url = jsCommonLib.siteUrl + '/devices/compare/';

    // parse zend url
    var params = jsGalleryLib.parseZendUrl(object.href);

    //var ajax = new Ajax.Request({success: 'devices-box'}, url,{method: 'get', parameters: params}); 
    //ajax = new Ajax.Request(url, {method: 'get', parameters: params, onSuccess: function(transport) { var jsonResponse = transport.responseText.evalJSON(true); makeParticipationAjaxSuccess(jsonResponse); }});
    var ajax = new Ajax.Request(url, {method: 'get', parameters: params, onComplete: function(transport) {var jsonResponse = transport.responseText.evalJSON(true);jsGalleryLib.updateDeviceElements(jsonResponse);jsGalleryLib.clickedOutsideElement();}});

  },

  /**
   * function: This function used in compareDevices function on complete status
   * 
   * @author Ivana Djordjevic <ivana.djordjevic@softserbia.com>
   * @param  {Object} jsonResponse // ajax json response
   * @return void  
  */  
  updateDeviceElements: function (jsonResponse) {
    
    //$('deviceImg').src= jsonResponse['imgSrc'];
    $('device-img-container').innerHTML = jsonResponse['img'];
    $('device-name').innerHTML = jsonResponse['name'];
    $('device-name').title = jsonResponse['name'];
    $('devicesSubmenuBox').innerHTML = jsonResponse['submenuBox'];
  },

  /**
   * function: It initializes navigation menu
   * 
   * @author Slavisa Miljanovic <slavisa.miljanovic@softserbia.com>
   * @param  {Hash} urlParams  Hash with back link url params
   * @return void
  */
  initializeNavigationMenu: function(urlParams) {
    // initialize navigation menu
    var navigationMenu = new Spry.Widget.MenuBar('designsNavigationMenu');

    // set back link url params into jsGalleryLib object
    jsGalleryLib.designUrlParams = urlParams;

    // show/hide back link element
    jsGalleryLib.showHideBackLink();
  },


  /**
   * function: It shows/hides back link from navigation menu
   * 
   * @author Slavisa Miljanovic <slavisa.miljanovic@softserbia.com>
   * @param  void
   * @return void
  */
  showHideBackLink: function() {
    var backLinkParentElement = $('designsNavMnuBack');    // parent <li> element for back link
    var backLink = backLinkParentElement.childElements();  // back link <a> element
    backLink = backLink[0];                                // only one child element exists in <li> element
    
    // get parent category id from cookie if it exists
    var parentCategoryId = jsCommonLib.getCookie('designsCategoryParentCategory'); 

    if ((typeof parentCategoryId == 'string') && (parentCategoryId != '')) {
      var href = jsCommonLib.siteUrl + '/gallery/index';
      
      jsGalleryLib.designUrlParams.each(function(param) {
        if (param.key == 'active-id') {
          // design category id from cookie
          href += '/design-category-id-' + param.value + '/' + parentCategoryId;            
        } else {
          href += '/' + param.key + '/' + param.value;
        }
      });
      
      backLink.onclick = function() {
        jsGalleryLib.updateDesignBox(href);
        return false;
      }
      
      // show back link element
      backLinkParentElement.setStyle({display: 'block'});

    } else {
      // hide back link element
      backLinkParentElement.setStyle({display: 'none'});
      //var c = "$('designsNavMnuBack').setStyle({display: 'none'})";
      //setTimeout(c, 2000);
    }
  },


  /**
   * function: It parses zend url
   * 
   * @author Slavisa Miljanovic <slavisa.miljanovic@softserbia.com>
   * @param  {String} hrefValue Html <a> element href
   * @return It returns url formated params
   * @type   String
  */
  parseZendUrl: function(hrefValue) {
    if (typeof hrefValue == 'undefined') {
      throw 'Something went wrong.';
    } else {
      // split url with '/' (slash)
      var paramsArray = hrefValue.split('/');
      
      var params = '?1=1';
      for (var i = 0; i < paramsArray.length; i++) {
        for (var j = 0; j < jsGalleryLib.zendUrlKeyPrefix.length; j++) {
          if (paramsArray[i].match(jsGalleryLib.zendUrlKeyPrefix[j])) {
            params += '&' + paramsArray[i] + '=' + paramsArray[i+1];  
          }
        }
      }

      return params;
    }
  },

  /**
   * function: It parses seo friendly url
   * 
   * @author Slavisa Miljanovic <slavisa.miljanovic@softserbia.com>
   * @param  {String} hrefValue  Html <a> element href
   * @param  {String} outputType Function output type
   * @return It returns url formated params or JSON object
   * @type   String (or JSON object)
  */
  parseSeoUrl: function(hrefValue, outputType) {
    // set default value for output type
    if (typeof outputType == 'undefined') {
      outputType = 'string';
    }

    if (typeof hrefValue == 'undefined') {
      throw 'Something went wrong.';
    } else {
      hrefValue = hrefValue.replace('.html', '');
      
      // need for select design link
      hrefValue = hrefValue.replace('?skinfull=true', '');

      // split url with '-' (dash)
      var paramsArray = hrefValue.split('-');
      
      var extractedParams = [];
      var elementsNumber = 4;                      // number of elements that should be extraced from array
      var lastElementId = paramsArray.length - 1;  // last element id
      for (var i = lastElementId; i > (lastElementId - elementsNumber); i--) {
        extractedParams[extractedParams.length] = paramsArray[i];
      }

      var params = null;

      if (outputType == 'string') {
        params = '?1=1';
        params += '&manufacturer-id='    + extractedParams[3];
        params += '&device-id='          + extractedParams[2];
        params += '&design-category-id=' + extractedParams[1];
        params += '&design-id='          + extractedParams[0];
      
      } else if (outputType == 'json') {
        params = {
          'manufacturer-id': extractedParams[3],
          'device-id': extractedParams[2],
          'design-category-id': extractedParams[1],
          'design-id': extractedParams[0]
        };
      
      } else {
        throw 'Something went wrong.';
      }
      return params;
    }
  },
    
  /**
   * function: It adds skin into shopping basket
   * 
   * @author Ivana Djordjevic <ivana.djordjevic@softserbia.com>
   * @param  {Object} object // Html <a> element
   * @return void  
  */ 
  addToShoppingBasket: function(object) {
    
    var url = jsCommonLib.siteUrl + '/gallery/add-to-shopping-basket/';

    // parse zend url
    var params = jsGalleryLib.parseZendUrl(object.href);

    var ajax = new Ajax.Request(url, {method: 'post', parameters: params, onComplete: function(transport) {var jsonResponse = transport.responseText.evalJSON(true);jsGalleryLib.updateShoppingBasket(jsonResponse);}});

  },

  /**
   * function: This fubction use on addToShoppingBasket function on Complete status
   * 
   * @author Ivana Djordjevic <ivana.djordjevic@softserbia.com>
   * @param  {Object} jsonResponse // json ajax response of addToShoppingBasket request
   * @return void  
  */   
  updateShoppingBasket: function(jsonResponse) {
    
    this.updateBasketContent(jsonResponse['basketContent']);
    
    $('checkout-btn-container').innerHTML = jsonResponse['checkoutBtnContainer'];
    $('add-to-cart-link').className = 'add-to-cart-gray';
    $('item-in-shopping-basket-container').setStyle({
      display: 'block'
    });
  },

  /**
   * function: This fubction updates basket content in the header
   * 
   * @author Ivana Djordjevic <ivana.djordjevic@softserbia.com>
   * @param  {String} cartNum // number of items in shopping basket
   * @return void  
  */
  updateBasketContent: function(cartNum) {

    $('basket-content').innerHTML = cartNum;
  },

  /**
   * function: This function adds rss feed for opened category
   * 
   * @author Slavisa Miljanovic <slavisa.miljanovic@softserbia.com>
   * @param  {Object} rssParams JSON Object
   * @return void  
  */   
  addRssFeed: function(rssParams) {
    var head = null;
    var rss = null;
    var rssExists = false;

    head = document.getElementsByTagName('head')[0];

    var headNodes = head.childNodes;

    for (var i=0; i<headNodes.length; i++) {
      if (headNodes[i].type == 'application/rss+xml') {
        if (headNodes[i].href == rssParams['href']) {
           rssExists = true;
           break;
        }
      }
    }

    // rss feed doesn't exist
    if (!rssExists) {
      rss = document.createElement('link');
      rss.href  = rssParams['href'];
      rss.rel   = rssParams['rel'];
      rss.type  = rssParams['type'];
      rss.title = rssParams['title'];
      head.appendChild(rss);
    }
  },

  /**
   * function: Clicking outside of device selector close selector
   *
   * @author Ivana Djordjevic <ivana.djordjevic@softserbia.com>
   * @return void
  */
  clickedOutsideElement: function() {

    $j("#select-device-link").mousedown(function(){
      // Another click on SELECT DEVICE shall close the device menu as well
      if ($('device-img-container') != null) {
        return false;
      } 
    });

    $j('#devicesContentBox').mousedown(function(e) {
      e.stopPropagation();
    });

    // fancy box
    /*
    $j('#fancybox-wrap').mousedown(function(e) {
      e.stopPropagation();
    });
    $j('#fancybox-overlay').mousedown(function(e) {
      e.stopPropagation();
    });
    $j('#fancybox-loading').mousedown(function(e) {
      e.stopPropagation();
    });
    */
    $j(document).mousedown(function() {
      if ($('device-img-container') == null) {
        // create prototype link object
        var aLink = document.createElement('a');
        aLink.setAttribute('href', jsCommonLib.siteUrl + '/gallery/index/' + jsGalleryLib.clickedOutsideElementParams);
        jsGalleryLib.updateDevicesBox(aLink);
      }
    });
  },

  /**
   * function: Get device active id
   *
   * @author Slavisa Miljanovic <slavisa.miljanovic@softserbia.com>
   * @return void
  */
  getDeviceActiveId: function() {
    if (this.deviceActiveId) {
      var activeId = this.deviceActiveId; 
    } else {
      var activeId = 1;    
    }
    
    return activeId;
  },

  /**
   * function: Set designs div scroll position
   *
   * @author Slavisa Miljanovic <slavisa.miljanovic@softserbia.com>
   * @return void
  */
  setDesignsDivScrollPosition: function() {
    var scrollTop = jsCommonLib.getCookie('designsDivScrollPosition' + this.getDeviceActiveId());
    if (scrollTop) {
      $j('#designs-content-list').scrollTop(scrollTop);
    }
  },

  /**
   * function: Set cookie skinFlash
   *
   * @author Ivana Djordjevic <ivana.djordjevic@softserbia.com>
   * @param {String} value / cookie value
   * @return
   * @type   null
  */
  setSkinsBlinkCookie: function(value) {
    jsCommonLib.setCookie('skinFlash', value, 10);
  },

  /**
   * function: Blink text for SELECT DEVICE and ALL DESIGNCATEGORIES on the SKINS page
   *
   * @author Ivana Djordjevic <ivana.djordjevic@softserbia.com>
   * @return
   * @type   null
  */
  blinkText: function() {

    // When user comes first time to SKINS (and only first time)
    var skinFlash = jsCommonLib.getCookie('skinFlash');
    if (skinFlash != null && skinFlash != '') {
        // set cookie again to extend validity
        this.setSkinsBlinkCookie(skinFlash);
        // clear timeout
        clearTimeout(this.blinkClearTimeOut);
        return;
    }
    // The button CHANGE DEVICE shal (1-2 seconds after page is fully loaded) became red and blink twice
    if (this.blinkTextCounter < 5) {
      /*
      if (this.blinkTextCounter % 2) {
        $('select-device-link').className = 'gallery-blink-link';
 
      } else {
        $('select-device-link').className = '';
      }
      */
      if (this.blinkTextCounter % 2) {
        $('select-device-link').setStyle({
          backgroundColor: '#ff0000'
        });
      } else {
        $('select-device-link').setStyle({
          backgroundColor: '#d6d036'
        });
      }

      // Afterward - 2-3" later...
      if (this.blinkTextCounter == 4) {
          this.blinkTimeOut = this.blinkTimeOut + this.blinkTimeoutAfterward;
      }

    // ...the same shall happen with the ALL DESIGNCATEGORIES button
    } else if (this.blinkTextCounter < 9) {
      // return previous value for timeout
      if (this.blinkTextCounter == 5) {
          this.blinkTimeOut = this.blinkTimeOut - this.blinkTimeoutAfterward;
      }

      if (this.blinkTextCounter % 2) {
        $('all-design-categories').setStyle({
          backgroundColor: '#ff0000'
        });
      } else {
        $('all-design-categories').setStyle({
          backgroundColor: '#3f91c5'
        });
      }
    } else if (this.blinkTextCounter == 9) {
        // set cookie firts time
        this.setSkinsBlinkCookie(this.blinkTextCounter);
    }

    this.blinkTextCounter++;

    this.blinkClearTimeOut = setTimeout('jsGalleryLib.blinkText();', this.blinkTimeOut);
  }


}
